虽说以前学过,但好久没练基本上忘光了,那我就从入门篇开始刷起吧。
The Triangle
Description 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Input
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.
Output
Your program is to write to standard output. The highest sum is written as an integer.
Sample Input 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 Sample Output 30 Source |
题目要求:
输入一个n层的三角形,第i层有i个数,求从第1层到第n层的所有路线中,权值之和最大的路线。
规定:第i层的某个数只能连线走到第i+1层中与它位置相邻的两个数中的一个。
题目分析:我用map[i][j]代表三角形第i行j列的值,dp[i][j]代表从map[i][j]开始向下走的最大和,因此我们最终要求的最大和就是dp[0][0]。
代码:
#include<iostream>
using namespace std;
const int MAX=110;
int map[MAX][MAX]; //这个三角形
int dp[MAX][MAX];
int main()
{
int n;
while(cin >> n)
{
for(int i=0;i<n;++i)
{
for(int j=0;j<=i;++j)
{
cin >> map[i][j];
}
}
for(int i=0;i<n;++i)
{
dp[n-1][i] = map[n-1][i];
}
for(int i=n-2;i>=0;i--)
{
for(int j=0;j<=i;++j)
{
dp[i][j] = map[i][j] + max(dp[i+1][j],dp[i+1][j+1]);
}
}
cout << dp[0][0] << endl;
}
return 0;
}
接下来,我们在对这段代码进行优化,我们不需要一个二维数组来保存每一个数字的最大和,首先我们用数组dp指向三角形的最后一行map[n-1],然后从最底层开始循环,逐步填充dp数组,最后最大和就是dp[0]
代码:
#include<iostream>
using namespace std;
const int MAX=110;
int map[MAX][MAX];
int *dp;
int main()
{
int n;
while(cin >> n)
{
for(int i=0;i<n;++i)
{
for(int j=0;j<=i;++j)
{
cin >> map[i][j];
}
}
dp = map[n-1];
for(int i=n-2;i>=0;i--)
{
for(int j=0;j<=i;++j)
{
dp[j]=max(dp[j],dp[j+1]) + map[i][j];
}
}
cout << dp[0] << endl;
}
return 0;
}
参考博客:http://blog.youkuaiyun.com/baidu_28312631/article/details/47418773