hdu

来源:互联网 发布:mysql中常用的类型 编辑:程序博客网 时间:2024/05/16 07:18

小兔的叔叔从外面旅游回来给她带来了一个礼物,小兔高兴地跑回自己的房间,拆开一看是一个棋盘,小兔有所失望。不过没过几天发现了棋盘的好玩之处。从起点(0,0)走到终点(n,n)的最短路径数是C(2n,n),现在小兔又想如果不穿越对角线(但可接触对角线上的格点),这样的路径数有多少?小兔想了很长时间都没想出来,现在想请你帮助小兔解决这个问题,对于你来说应该不难吧!
Input
每次输入一个数n(1<=n<=35),当n等于-1时结束输入。
Output
对于每个输入数据输出路径数,具体格式看Sample。
Sample Input
1312-1
Sample Output
1 1 22 3 103 12 416024

代码:

#include<iostream>#include<string>#include<cstdio>#include<algorithm>#include<cmath>#include<iomanip>#include<queue>#include<cstring>#include<map>using namespace std;typedef long long ll;#define M 40ll dp[M][M];int n;void init() //只分析对角线以下所有点,整个棋盘再乘2{    int i,j;     //i是行,j是列    for(i=0;i<=36;i++)        dp[0][i]=1; //第一行都能来自左边    for(i=0;i<=36;i++)    {        dp[i][i]=dp[i-1][i];  //对角线上的点只能来自下方        for(j=i+1;j<=36;j++)  //其余点课来自左边和下边        {            dp[i][j]=dp[i-1][j]+dp[i][j-1];        }    }}int main(){    init();    int cas=0;    while(scanf("%d",&n)!=EOF)    {        if(n==-1)            break;        printf("%d %d %lld\n",++cas,n,dp[n][n]*2);     }    return 0;}