Problem P
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 51 Accepted Submission(s) : 29
2 1 2
37
题目大意:在一个无限大的平面,只可以走三个方向,不能后退,走过的格子也不能走,求走n步有多少种不同方案
解题思路:要分两种情况来考虑,a(n)为向上,b(n)为向左跟向右,f(n)为当前方案数。 a(n) = a(n-1) + b(n-1);因为向上只有一个方向。 b(n) =a(n-1) * 2 + b(n-1);因为之前的向上可以走两个方向,而之前的向左或者向右只能继续按照原来的方向走,因为走过的路会消失。 f(n) = a(n) + b(n); 所以可以推出: f(n) = f(n-1) * 2 + a(n-1) = f(n-1) * 2 + f(n-2);
代码:#include<iostream> using namespace std; const int MAX = 25; int main() { int cas; int f[MAX]; f[0] = 1; f[1] = 3; for(int i = 2; i < MAX; i++) f[i] = 2 * f[i-1] + f[i-2]; scanf("%d", &cas); while(cas--) { int n; scanf("%d", &n); printf("%d\n", f[n]); } return 0; }