杭电 2067

来源:互联网 发布:守望先锋各个性能数据 编辑:程序博客网 时间:2024/06/18 00:17

小兔的棋盘

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6326    Accepted Submission(s): 3435


Problem Description
小兔的叔叔从外面旅游回来给她带来了一个礼物,小兔高兴地跑回自己的房间,拆开一看是一个棋盘,小兔有所失望。不过没过几天发现了棋盘的好玩之处。从起点(0,0)走到终点(n,n)的最短路径数是C(2n,n),现在小兔又想如果不穿越对角线(但可接触对角线上的格点),这样的路径数有多少?小兔想了很长时间都没想出来,现在想请你帮助小兔解决这个问题,对于你来说应该不难吧!
 


Sample Input
1312-1
 

Sample Output
1 1 22 3 103 12 416024
 

Author
Rabbit
 

Source
RPG专场练习赛
 考察的也是递推,画出棋盘,就可以看到,这个歌棋盘关于那个对角线是对称的,只要求出一个就行, 除了第0列还有第0行,每个位置都有两种方式到达,就拿左边的棋盘为例,就有上面,还有左边两种途径,但是因为终点是对角线上的某点,所以不穿过对角线,对角线两侧又是对称的,所以有f[i][j]=f[i-1][j]当然也可以写成f[i][j]=f[i][j-1],其他的一般的点 有两种路径所以是f[i][j]=f[i-1][j]+f[i][j-1]
代码如下:
#include<stdio.h>__int64 a[44][44];int main(){int n,m=0,i,j;for(i=0;i<44;i++){a[0][i]=1;}for(i=1;i<44;i++){for(j=1;j<44;j++){if(i==j)a[i][j]=a[i-1][j];elsea[i][j]=a[i-1][j]+a[i][j-1];}}while(~scanf("%d",&n),n!=-1){printf("%d %d %I64d\n",++m,n,2*a[n][n]);}return 0;}


0 0