题目链接
题解
题意:
- 有一个数字三角形。现在从上到下,每次能向下或者向下右偏一个(比如1能到下面的7或7右边第一个4),这样直到最底下一层,将经过的数字加起来,求最大和。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
思路:
- 最简单的dp。每次输入第i行第j列的数,就更新当前该位置最大数字和,即
- T[i][j].max_sum = T[i][j].num + max(T[i-1][j].max_sum, T[i-1][j-1].max_sum)
Code
#include<iostream>
#include<memory.h>
#include<string.h>
using namespace std;
struct node
{
int num;
int max_sum;
}T[1002][1002];
int max(int a,int b)
{
return a > b ? a : b;
}
int main()
{
int r, ans;
while(cin >> r)
{
ans = 0;
memset( T, 0, sizeof(T));
for(int i = 1;i <= r; i++)
{
for(int j = 1; j <= i; j++)
{
cin >> T[i][j].num;
T[i][j].max_sum = T[i][j].num + max(T[i-1][j].max_sum, T[i-1][j-1].max_sum);
}
}
for(int i = 1; i <= r; i++)
ans = max(ans,T[r][i].max_sum);
cout << ans << endl;
}
}