设为首页 加入收藏

TOP

C语言-数学-统计问题(Hdu 2563)
2015-01-21 11:09:21 来源: 作者: 【 】 浏览:19
Tags:语言 数学 统计 问题 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;
}
  




】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇OC:OC中的集合类-NSSet(二) 下一篇C语言贪心-最少拦截系统(Hdu 1257)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: