参考代码:
1 #include <iostream> 2 using namespace std; 3 4 typedef long long ll; 5 const ll maxn = 50 + 5; 6 ll dp[maxn]; 7 8 int main() { 9 ll t, a, b, now; 10 dp[2] = 1; 11 dp[3] = 2; 12 for(int i = 4; i <= maxn; i ++) { 13 dp[i] = dp[i - 1] + dp[i - 2]; 14 } 15 cin >> t; 16 while(t --) { 17 cin >> a >> b; 18 now = b - a + 1; 19 cout << dp[now] << endl; 20 } 21 return 0; 22 }
参考代码:
1 /* 2 递推思想,很容易可以手推出3种情况,我们可以确定的是,在放第涂第n个格子的时候前n - 1个格子已经涂完了,所以对于第n个格子,我们分为以下两种情况 3 <1>:前n - 1个格子已经涂完了,涂的方法有dp[n - 1]种,我们确定第n - 1和第n个不同色,并且要求第n个和第一个不同色,所以第n个只有一种图法,乘法规律我们知道在确定前n - 1种格子的涂法时第n个有dp[n - 1]种图法。 4 <2>:前n - 2个格子已经涂完了,涂的方法有dp[n - 2]种,这时我们知道,第n - 1个格子的颜色肯定是与第一个格子相同的,因为如果他们不同,则第n个格子又只有一种图法,和情况一是一样的,第n个格子我们有两种图法,所以由乘法规律的在提前确定n - 2个格子的涂法时第n个格子有2 * dp[n - 2]种涂法。 5 */ 6 #include <cstdio> 7 using namespace std; 8 9 typedef long long ll; 10 const int maxn = 50 + 5; 11 ll dp[maxn]; 12 13 int main() { 14 int n; 15 dp[1] = 3; 16 dp[2] = 6; 17 dp[3] = 6; 18 for(int i = 4; i <= maxn; i ++) { 19 dp[i] = dp[i - 1] + 2 * dp[i - 2]; 20 } 21 while(~scanf("%d", &n)) { 22 printf("%lld ", dp[n]); 23 } 24 return 0; 25 }