zoukankan      html  css  js  c++  java
  • HDU2067小兔的棋盘

    Description

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

    Input

    每次输入一个数n(1<=n<=35),当n等于-1时结束输入。
     

    Output

    对于每个输入数据输出路径数,具体格式看Sample。
     

    Sample Input

    1 3 12 -1
     

    Sample Output

    1 1 2 2 3 10 3 12 416024
     

    简单的动态规划,很适合入门啊,之前就在做动态规划,没想到训练赛中就遇到了。

    这应该算是一个分界了吧,由理论的学习转为水题突然想到一个很搞笑的比喻,算法的难度就是一个女人衣服,一个男人的想法都在这件衣服上,但想得到的却不是这件衣服。

    算法的难度一定程度上是我喜欢的原因,哈哈,真是嘲讽啊.

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<string.h>
     4 using namespace std;
     5 long long dp[40][40];
     6 int main()
     7 {
     8     int n;
     9     int t=1;
    10     for(int i=1;i<=36;i++)
    11         dp[i][0]=1;
    12     for(int i=1;i<36;i++)
    13     {
    14         for(int j=1;j<36;j++)
    15         {
    16             if(i==j) dp[i][j]=dp[i][j-1];
    17             else
    18                 dp[i][j]=dp[i-1][j]+dp[i][j-1];
    19         }
    20     }
    21     while(cin>>n&&n!=-1)
    22     {
    23         cout<<t++<<" "<<n<<" ";
    24         cout<<2*dp[n][n]<<endl;
    25     }
    26 }

    简单的介绍一下这道题:

    因为要求最短路径,所以反复走是不可以了,所以边上的格子只能有一条路径(无论离起点多远),这个条件可以当做已知,还有就是对对角线的处理,题中要求不能跨过对角线,

    我们先想一下什么叫做经过了某一个格子,把一个到一个格子的所有路径数加上就算是经过了这个格子,那么现在就可以很好地处理不经过对角线了,我们只需要不加对经过对角线的路径数就好了。还有一点要说的是由于是往下走过程中,1.上三角形中的路径数加不到下三角形中,2.终点在对角线上,这导致了算的过程中只计算了一半的路径数,为什么是一半呢,还是对角线分割倒是上下路径数对称。值得说的好像就这些了,反正是一道水题。

  • 相关阅读:
    Object-C,NSSet,不可变集合
    NYIST 860 又见01背包
    NYIST 1070 诡异的电梯【Ⅰ】
    HDU 1542 Atlantis
    HDU 4756 Install Air Conditioning
    CodeForces 362E Petya and Pipes
    HDU 4751 Divide Groups
    HDU 3081 Marriage Match II
    UVA 11404 Palindromic Subsequence
    UVALIVE 4256 Salesmen
  • 原文地址:https://www.cnblogs.com/VectorLin/p/5198991.html
Copyright © 2011-2022 走看看