• hdu 2067 小兔的棋盘


    题目

    题意:求 从起点(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:今天再次看了一下这个题,观察最后一列,没错这就是传说中的卡特兰数。

  • 相关阅读:
    【剑指Offer】面试题55
    一大波趣图:CSS的力量
    你必须收藏的Github技巧
    3月份GitHub上最热门的Java开源项目
    趣图:快下班了,剩一个bug,修复一下再走
    Java程序员必备的Intellij插件
    为什么前后端分离了,你比从前更痛苦?
    趣图:好好干,今天再加个班
    高并发下的下单功能设计
    Mybatis的基本要素--核心对象
  • 原文地址:https://www.cnblogs.com/qie-wei/p/10160275.html
Copyright © 2020-2023  润新知