http://acm.hdu.edu.cn/showproblem.php?pid=2084 |
数塔Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 57124 Accepted Submission(s): 33581 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:
Input 输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间[0,99]内。
Output 对于每个测试实例,输出可能得到的最大和,每个实例的输出占一行。
Sample Input 1 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
Sample Output 30 |
简单dp,从上到下。
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int dp[105][105];
int main()
{
int c;
cin>>c;
int n;
while(c--)
{
memset(dp,0,sizeof(dp));
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
cin>>dp[i][j];
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
dp[i][j]+=max(dp[i-1][j-1],dp[i-1][j]);
//cout<<"dp["<<i<<"]["<<j<<"]="<<dp[i][j]<<endl;
}
}
int sum=dp[n][1];
for(int i=2;i<=n;i++)
sum=max(sum,dp[n][i]);
cout<<sum<<endl;
}
return 0;
}