C語言-數學-統計問題(Hdu 2563)
Problem Description 在一無限大的二維平面中,我們做如下假設:
1、 每次只能移動一格;
2、 不能向後走(假設你的目的地是“向上”,那麼你可以向左走,可以向右走,也可以向上走,但是不可以向下走);
3、 走過的格子立即塌陷無法再走第二次;
求走n步不同的方案數(2種走法只要有一步不一樣,即被認為是不同的方案)。
Input 首先給出一個正整數C,表示有C組測試數據
接下來的C行,每行包含一個整數n (n<=20),表示要走n步。
Output 請編程輸出走n步的不同方案總數;
每組的輸出占一行。
Sample Input
2
1
2
這裡我們始終定義前為正方向.
我們用
a [ i ] 表示朝前走i步的種類,我們用
b [ i ] 表示朝左(右)走 i 步的種類, 顯然
a [ 1 ] = 3,b [ 1 ] = 2;
然後分治的思想: 向前走 i 步(i>1)的種類相當於向前走 i-1 步的種類加上向左、向右走 i-1 步的種類. 數學式子表示就是:
a [ i ] = a [ i-1 ]+2*b [ i-1 ]; 向左(向右)走 i 步(i>1)的種類相當於向前走 i-1 步的種類加上向右(向左)走 i-1 步的種類. 數學式子表示就是:
b [ i ] = a [ i-1 ]+b [ i-1 ];
然後遞推可得.
代碼如下:
#include
int main()
{
int a[21]={0,3},b[21]={0,2},i;
for(i=2;i<21;i++)
{
b[i]=a[i-1]+b[i-1];
a[i]=a[i-1]+2*b[i-1];
}
int m,N;
scanf("%d",&N);
while(N--)
{
scanf("%d",&m);
printf("%d\n",a[m]);
}
return 0;
}