<每日一题> Day5:简单递推两题

 原题链接

参考代码:

  

 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\n", dp[n]);
23     }
24     return 0;
25 }

猜你喜欢

转载自www.cnblogs.com/bianjunting/p/10924412.html