题意:求 从起点(0,0)走到终点(n,n)的最短路径数。已知n<=35
题中说:从起点(0,0)走到终点(n,n)的最短路径数是C(2n,n),没有明白这个C(2n,n)是什么意思。
摘抄:
因为要求最短路径,所以反复走是不可以了,所以边上的格子只能有一条路径(无论离起点多远),这个条件可以当做已知,还有就是对对角线的处理,题中要求不能跨过对角线,
我们先想一下什么叫做经过了某一个格子,把一个到一个格子的所有路径数加上就算是经过了这个格子,那么现在就可以很好地处理不经过对角线了,我们只需要不加对经过对角线的路径数就好了。还有一点要说的是由于是往下走过程中,1.上三角形中的路径数加不到下三角形中,2.终点在对角线上,这导致了算的过程中只计算了一半的路径数,为什么是一半呢,还是对角线分割倒是上下路径数对称
#include<iostream>
#include<stdio.h>
#include<string.h>
#define N 36
__int64 chessboard[N][N];
void init(){
int i,j;
memset(chessboard,0,sizeof(chessboard));
for (i=0;i<N;i++)
chessboard[i][0]=1;
for (i=1;i<N;i++) {
for (j=1;j<=i;j++) {
chessboard[i][j]=chessboard[i-1][j]+chessboard[i][j-1];
//printf("%d ",chessboard[i][j]);
}
// printf("
");
}
}
int main()
{
int n;
int cnt=0;
init();
while(~scanf("%d",&n))
{
if(n==-1) break;
cnt++;
printf("%d %d %I64d
",cnt,n,2*chessboard[n][n]);
}
return 0;
}
最后要说的是,刚开始拿到这道题,不知道从何下手,看了别人的博客发现居然要用动态规划,怎么也没想到要用动态规划,居然是水题,但朕做不来啊。
version1.1:今天再次看了一下这个题,观察最后一列,没错这就是传说中的卡特兰数。