首页 > 代码库 > C语言_数学(1)___统计问题(Hdu 2563)

C语言_数学(1)___统计问题(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 <stdio.h>
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;
}




C语言_数学(1)___统计问题(Hdu 2563)