ACM第三次練習—1016

題意:在一無限大的二維平面中,我們做如下假設:

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];

感想:求方案數的題不會。

代碼:

  1. #include<iostream>  
  2. using namespace std;  
  3. int c,n;  
  4. __int64 f[21];  
  5. int main()  
  6. {  
  7.     int i;  
  8.     f[1]=3;f[2]=7;  
  9.     for(i=3;i<21;i++)  
  10.     {  
  11.       f[i]=f[i-1]*2+f[i-2];  
  12.     }  
  13.     scanf("%d",&c);  
  14.     while(c--)  
  15.     {  
  16.       scanf("%d",&n);  
  17.       printf("%I64d\n",f[n]);  
  18.     }  
  19.     return 0;  
  20. }  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章