递推求解
记录点滴。
1 /* 2 2015.6 HT 3 ACM Work_4 4 5 */ 6 #include <iostream> 7 #include<algorithm> 8 using namespace std; 9 10 /* 11 超级楼梯 12 一楼梯共M级,刚开始在第一级,每次只能跨上一级或二级 13 要走上第M级,共有多少种走法? 14 输入每行包含一个整数M(1<=M<=40),表示楼梯的级数 15 16 直接构造一个40以内的斐波那契数列即可,f1=1,f2=1 17 */ 18 //int sum, m, a[41]; 19 //void f() 20 //{ 21 // a[1] = 1; 22 // a[2] = 1; 23 // for (int i = 3; i <= 40; i++) 24 // a[i] = a[i - 1] + a[i - 2]; 25 //} 26 // 27 //int main() 28 //{ 29 // int n; 30 // f(); 31 // cin >> n; 32 // while (n--) 33 // { 34 // cin >> m; 35 // cout << a[m] << endl; 36 // } 37 // return 0; 38 //} 39 40 41 42 /* 43 不容易系列之(3)—— LELE的RPG难题 44 有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子 45 每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法 46 (0<n<=50) 47 48 1.前面n-1个方格填好了色,有f(n-1)种情况,此时第n-1个跟第一个颜色一定不一样,所以第n个只有一种选择 49 2.对前面n-2个方格填好色,有f(n-2)种情况,第n-1个空格颜色跟第一个颜色一样,最后第n个方格可以填两种颜色,所以是 2*f(n-2) 50 推出f(n)=f(n-1)+2(n-2) n>=4 51 */ 52 //int main() 53 //{ 54 // int i; 55 // // int会溢出 56 // __int64 d[51] = { 0, 3, 6, 6 }; 57 // for (i = 4; i < 51; i++) 58 // d[i] = d[i - 1] + 2 * d[i - 2]; 59 // while (cin >> i) 60 // cout << d[i] << endl; 61 // 62 // return 0; 63 //} 64 65 66 67 /* 68 折线分割平面 69 f(n) = 2n^2-n+1 70 71 封闭曲线分割平面 72 f(n) = n^2-n+2 73 74 平面分割空间 75 f(n) = (n^3+5n)/6+1 76 */ 77 78 79 80 /* 81 悼念512汶川大地震遇难同胞——重建希望小学 82 学校教室的长度为n米,宽度为3米,现在我们有2种地砖,规格分别是1米×1米,2米×2米, 83 如果要为该教室铺设地砖,请问有几种铺设方式呢? 84 85 s[n]=s[n-1]+2*s[n-2] 86 */ 87 int main() 88 { 89 int n[31], i, m, t; 90 n[1] = 1; 91 n[2] = 3; 92 for (i = 3; i <= 30; ++i) 93 { 94 n[i] = n[i - 1] + n[i - 2] * 2; 95 } 96 cin >> t; 97 while (t--) 98 { 99 cin >> m; 100 cout << n[m] << endl; 101 } 102 return 0; 103 } 104 105 106 107 /* 108 统计问题 109 你可以向左走,可以向右走,也可以向上走 110 走过的格子立即塌陷无法再走第二次,求走n步不同的方案数 111 112 设往上走的步数为a(n),往左或往右走的步数为b(n) 113 f(n)=a(n)+b(n) 114 a(n)=a(n-1)+b(n-1), b(n)=2*a(n-1)+b(n-1) 115 化简得 f(n) = 2*f(n-1) + f(n-2) 116 */