杭电OJ2047

来源:互联网 发布:深圳云之讯网络 编辑:程序博客网 时间:2024/06/03 09:24
/*方法一: 找第n种情况,考虑用递推(这种解法类似于杭电OJ 2047,从第n种填什么去分析) 第n种情况可以填入的字符串有E,O,F三种情况1.当填E时,前面n-1个填的方法数是a[n-1],2.当填F时,前面n-1个填的方法数是a[n-1],3.当填O时,因为相邻两个不能是O,O,所以第n-1种只能填E,F,因为a[n-1]的第n-1种必须E,O,F都要填入,(关键弄清a[n-1]代表什么意义,不满足就继续往前找a[n-2],直到满足为止)   所以往前看第n-2种,因为第n-1种只能填E,F,所以第n-2种可填入三种字符,即a[n-2],  所以填O时的方法数为2*a[n-2] */#include <iostream>using namespace std;int main(){__int64 a[50];//long long都放不下的用__int64来存储 a[1] = 3;a[2] = 8;int n;while(cin >> n){for(int i = 3; i <= n; i++){a[i] = 2*a[i-1] + 2*a[i-2];}cout << a[n] << endl;}return 0;}//===============================================================================================/*方法二: (实际是在方法一的基础上向下递推了一次,思路一样) 找第n种情况,考虑用递推,去找第n-1种情况因为相邻两个不能是O,O,所以第n-1种填的进行分类讨论1.当第n-1种填的不是O,即填的是E,F时,第n种可填E,O,F三种字符,而a[n-1]代表第n-1种三种字符都要填入,这里只填了E,F  所以考虑第n-2种情况,因为第n-1种填的是E,F,所以第n-2种可填入三种字符,即a[n-2],  当第n-1种填的不是O,方法数:3*2*a[n-2]2.当第n-1种填的是O,第n种只能填入E,F,而a[n-1]代表第n-1种三种字符都要填入,这里只填了O  所以考虑第n-2种情况,因为第n-1种填的是O,所以第n-2种只能填入E,F,而a[n-2]代表第n-2种三种字符都要填入,这里只填了E,F   所以考虑第n-3种情况,因为第n-2种填的是E,F,所以第n-3种可填入三种字符,即a[n-3],  当第n-1种填的是O,方法数:2*1*2*a[n-3] *//*错误做法:找第n种情况,去找第n-1种的情况1.当第n-1种填的是O,则第n种只能填E,F,所以方法数:2*a[n-1],但是a[n-1]代表的是三种都要填入,这里只填了O,是不是多算了呢?!   所以递推时要弄清a[n-1]等式子代表的意义 */#include <iostream>using namespace std;int main(){__int64 a[50];a[1] = 3;a[2] = 8;a[3] = 22;int n;while(cin >> n){for(int i = 4; i <= n; i++){a[i] = a[i - 3]*2*1*2 + a[i - 2]*2*3;//有了i-3的情况就要把基础提升到从4开始 }cout << a[n] << endl;}return 0;}

0 0
原创粉丝点击