分析,这题其实是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><</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><</b>21<b>;</b>i<b>++)</b><b></b>
for<b>(</b><b>int</b> j<b> =</b> 2<b>;</b>j<b><</b>21<b>;</b>j<b>++)</b>
{<b></b>
if<b>(</b>i<b>>=</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>>></b>m<b>>></b>n<b>)</b>
cout<b><<</b>d<b>[</b>m<b>][</b>n<b>]<<</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>