标签:c语言 数学 分治
Problem Description
在一无限大的二维平面中,我们做如下假设:
1、 每次只能移动一格;
2、 不能向后走(假设你的目的地是“向上”,那么你可以向左走,可以向右走,也可以向上走,但是不可以向下走);
3、 走过的格子立即塌陷无法再走第二次;
求走n步不同的方案数(2种走法只要有一步不一样,即被认为是不同的方案)。
Input
首先给出一个正整数C,表示有C组测试数据
接下来的C行,每行包含一个整数n (n<=20),表示要走n步。
Output
请编程输出走n步的不同方案总数;
每组的输出占一行。
Sample Input
这里我们始终定义前为正方向.
我们用 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)
标签:c语言 数学 分治
原文地址:http://blog.csdn.net/y1196645376/article/details/42080357