题意:在一无限大的二维平面中,我们做如下假设:
1、每次只能移动一格;
2、不能向后走(假设你的目的地是“向上”,那么你可以向左走,可以向右走,也可以向上走,但是不可以向下走);
3、走过的格子立即塌陷无法再走第二次;
求走n步不同的方案数(2种走法只要有一步不一样,即被认为是不同的方案)。
思路:
f[n]表示走n步的方案数,x[n]表示向下走的方案数,z[n]表示向左右走的方案数;
所以 f[n]=x[n]+z[n],
x[n]=x[n-1]+z[n-1];
z[n]=x[n-1]*2+z[n-1];
所以f[n]=2*f[n-1]+x[n-1]===>f[n]=2*f[n-1]+f[n-2];
感想:求方案数的题不会。
代码:
- #include<iostream>
- using namespace std;
- int c,n;
- __int64 f[21];
- int main()
- {
- int i;
- f[1]=3;f[2]=7;
- for(i=3;i<21;i++)
- {
- f[i]=f[i-1]*2+f[i-2];
- }
- scanf("%d",&c);
- while(c--)
- {
- scanf("%d",&n);
- printf("%I64d\n",f[n]);
- }
- return 0;
- }