题意
输入一个三角形,从最顶层的数字开始向左下或向右下走,每条路径都加起来,问和最大的那条路径的和多少。
思路
这算是第二次接触DP,第一次是做leetcode的最长上升子序列问题。
DP在我看来有一点内存换时间
的意思 ,就是存储先前已经计算过的路径,然后在接下来的计算中使用。
在这里推荐一篇文章,我觉得把DP讲的非常好,链接:https://blog.csdn.net/baidu_28312631/article/details/47418773
代码
#include <stdio.h>
#define MAXN 10000 + 10
#define N 100 + 10
#define Max(x, y) (x > y ? x : y)
int cache[N][N];
int maxsum[MAXN];
int main() {
int R, i, j;
while(~scanf("%d", &R)) {
for(i = 1; i <= R; i++)
for(j = 1; j <= i; j++)
scanf("%d", &cache[i][j]);
for(i = 1; i <= R; i++)
maxsum[i] = cache[R][i];
for(i = R - 1; i >= 1; i--)
for(j = 1; j <= i; j++)
maxsum[j] = Max(maxsum[j], maxsum[j+1]) + cache[i][j];
printf("%d\n", maxsum[1]);
}
return 0;
}