题目:
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
(Figure 1)
Your program is to read from standard input. The first line contains one integer N: the number of rows in the triangle. The following N lines describe the data of the triangle. The number of rows in the triangle is > 1 but <= 100. The numbers in the triangle, all integers, are between 0 and 99.
Your program is to write to standard output. The highest sum is written as an integer.
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
30
大概意思是:从数字三角形的顶端开始,寻找一条路径,使这条路径上每个结点数值之和最大,规定在每个节点处只能向左下或右下行进。
解析:这道题当然是用动态规划来做啦!建立一个数组dp[][]用来存储从每个结点开始的最大值路径,然后运用状态转移方程:dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])就可以啦!题目和代码都比较简单。
下面是AC过得代码:
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
int main()
{
int n;//表示三角形有n层
cin>>n;
int tri[n+1][n+1];
int dp[n+2][n+2];
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
cin>>tri[i][j];
memset(dp,0,sizeof(dp));
for(int i=n;i>=1;i--)
{
for(int j=1;j<=i;j++)
dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+tri[i][j];
}
cout<<dp[1][1]<<endl;
return 0;
}