且未

博客园 首页 新随笔 联系 订阅 管理

题目

题意:求 从起点(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\t",chessboard[i][j]);
        }
           // printf("\n");
    }
}
int main()
{
    int n;
    int cnt=0;
     init();
     while(~scanf("%d",&n))
     {
         if(n==-1) break;
         cnt++;
         printf("%d %d %I64d\n",cnt,n,2*chessboard[n][n]);
     }
    return 0;
}


最后要说的是,刚开始拿到这道题,不知道从何下手,看了别人的博客发现居然要用动态规划,怎么也没想到要用动态规划,居然是水题,但朕做不来啊。

version1.1:今天再次看了一下这个题,观察最后一列,没错这就是传说中的卡特兰数。

 

posted on 2017-10-09 13:24  阿聊  阅读(131)  评论(0编辑  收藏  举报