HDU1267-动态规划

来源:互联网 发布:gzip压缩linux 编辑:程序博客网 时间:2024/05/30 04:05

下沙的沙子有几粒?

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2396    Accepted Submission(s): 1269

Problem Description
XX提出了一个猜想:“假定一个字符串由m个H和n个D组成,从左到右扫描该串,如果字符H的累计数总是不小于字符D的累计数,那么,满足条件的字符串总数就恰好和下沙的沙粒一样多。”
问题来了,如果已知m和n的值,请计算下沙的沙粒到底有多少。
Input
输入数据包含多个测试实例,每个占一行,由两个整数m和n组成,m和 n 分别表示字符串中H和D的个数。数据范围是(1<=n<=m<=20)。
Output
对于每个测试实例,请输出下沙的沙粒到底有多少,每个实例的输出占一行。
Sample Input
1 13 1
Sample Output
13
Author
lcy
Source
HDU 2006-4 Programming Contest
 
解释:
        题目废话十分多,我已经把没用的废话全删掉了。只留下最核心的问题。由于结果可能会十分大,而且题目给出的题意很适合DP解法。
假设dp[m][n]表示的是由m个H和n个D组成的满足条件的字符串的个数。现在dp[m][n]可以由哪些状态转移而来呢?如果第n+m个字符是H,则
dp[m][n]由dp[m-1][n]转移而来,如果第n+m个字符是D,则有dp[m][n]可由dp[m][n-1]转移而来,
        dp[m][n] = dp[m-1][n]+dp[m][n-1],dp[m][0]=1,且m>=n
#include <iostream>using namespace std;int H,D;__int64 dp[100][100];//dp[m][n]void DP(){int i,j;for(i=0; i<=20; ++i){dp[i][0] = 1;}for(i=1; i<=20; ++i){for(j=1; j<=i; ++j){dp[i][j] = dp[i-1][j]+dp[i][j-1];}}}int main(){DP();while(cin >> H >>D){cout << dp[H][D] << endl;}return 0;}
0 0