您的位置:首页 > 其它

周赛解题报告续

2015-11-29 11:04 302 查看

D_HDU
2067

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

这道题是一个正方形的矩阵,计算时只需要计算主对角线一边的路径再乘以2就是整个的路径,需要注意的地方就是题上给的是计算(0,0)到(n,n)的路径,其中应该包括(n+1)*(n+1)个点,我计算的是对角线右上方的三角形,其中需要先给第一行的所有点赋初值为1,因为计算第一行的 d[i][j]=d[i-1][j]+d[i][j-1]时i-1=-1不存在,最后会发现第一行所有的点的值一直是0,而实际上应该为1,有一条路径可以到达的。

#include <iostream>

#include<cstdio>

#include<cstring>

using namespace std;

long long d[40][40];                                  //d[i][j]表示到达第i行第j列的路径有多少条

int main()

{

    int n,num=1;

    while(~scanf("%d",&n))

    {
memset(d,0,sizeof(d));

        if(n==-1) break;

        for(int i=0;i<=n;i++)

        {

            d[0][i]=1;                                                //先给第一行的所有点赋初值为1

        }

        for(int i=1;i<=n;i++)

        {

            for(int j=i;j<=n;j++)

            {
                d[i][j]=d[i-1][j]+d[i][j-1];                                     //每个点可以从他的上方和左方到达他,然后再通过他去到他的右方和下方

                //printf("%d %d %d\n",i,j,d[i][j]);

            }

        }

        printf("%d %d %lld\n",num,n,d

*2);

        num++;

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: