天天看点

HDU 下沙的沙子有几粒

分析,这题其实是H和D的组合排列问题,只不过要考虑期间累计的H和D的数量关系。

用DP来做,可以推导出:

dp[i][j] = dp[i-1][j] + dp[i][j-1]

dp[][]前一个表示H的数量,后一个表示D的数量。

分上面那种情况是因为最后一个必然是H或者D,而此时可以考虑把新加的一个放在最后,因为假如加的是H,如果加在[i-1][j]中加入H,则最后一个依然是H或D,此时如果成立,那么依然属于[i-1][j]或[i][j-1]的情况。

所以推导出此递推关系。

#include <iostream>

<b></b>

using namespace std<b>;</b><b></b>

int<b> main</b><b>()</b>

{<b></b>

    __int64 d<b>[</b>21<b>][</b>21<b>];</b>

    d<b>[</b>1<b>][</b>1<b>] =</b> 1<b>;</b>

    d<b>[</b>2<b>][</b>1<b>] =</b> 2<b>;</b>

    d<b>[</b>1<b>][</b>2<b>] =</b> 0<b>;</b><b></b>

    for<b>(</b><b>int</b> i<b> =</b> 1<b>;</b> i<b>&lt;</b>21<b>;</b>i<b>++)</b>

        d<b>[</b>i<b>][</b>1<b>] =</b> i<b>;</b><b></b>

    for<b>(</b><b>int</b> i<b> =</b> 2<b>;</b>i<b>&lt;</b>21<b>;</b>i<b>++)</b><b></b>

    for<b>(</b><b>int</b> j<b> =</b> 2<b>;</b>j<b>&lt;</b>21<b>;</b>j<b>++)</b>

    {<b></b>

        if<b>(</b>i<b>&gt;=</b>j<b>)</b>

        d<b>[</b>i<b>][</b>j<b>] =</b> d<b>[</b>i<b>-</b>1<b>][</b>j<b>] +</b> d<b>[</b>i<b>][</b>j<b>-</b>1<b>];</b><b></b>

        else d<b>[</b>i<b>][</b>j<b>] =</b> 0<b>;</b>

    }<b></b>

    int m<b>,</b>n<b>;</b><b></b>

    while<b>(</b>cin<b>&gt;&gt;</b>m<b>&gt;&gt;</b>n<b>)</b>

    cout<b>&lt;&lt;</b>d<b>[</b>m<b>][</b>n<b>]&lt;&lt;</b>endl<b>;</b><b></b>

    return 0<b>;</b>

}

<b>本文转自NewPanderKing51CTO博客,原文链接:</b><b>http://www.cnblogs.com/newpanderking/archive/2011/07/31/2122540.html</b><b> ,如需转载请自行联系原作者</b>

继续阅读