題意:在一無限大的二維平面中,我們做如下假設:
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;
- }