数字三角形(数塔问题)

一句话题目:给出一个n层的三角形,每个位置有一个数字,到达后可获得,求到达最低层能达到的最大数字和。

 

题目分析:

首先我们考虑能不能用搜索做,因为对于一个坐标,我们只有向下的左边或者右边。对于一个三角形我们进行特殊的处理,比如下面的三角形我们可以处理成

我们可以观察出状态转换方程为:f[i][j] = max(f[i+1][j],  f[i+1][j+1])  + val[i][j] ,即处于横纵坐标分别为i,j位置的点的最大数字和为 这一点左下方或右下方的值 + 此点的数字

#include <cstdio>
#include <iostream>

const int maxn = 1010;
using namespace std;
int n;
int f[maxn][maxn], val[maxn][maxn];
int main(){
    scanf("%d", &n);
    for (int i = 1;i <= n;i ++)
        for (int j = 1;j <= i;j ++) scanf("%d", &val[i][j]);
    for (int i = n;i >= 1;i --)
        for (int j = 1;j <= i;j ++)
            f[i][j] = max(f[i+1][j], f[i+1][j+1]) + val[i][j];
    printf("%d", f[1][1]);
    return 0;
}
原文地址:https://www.cnblogs.com/wxx23-IOU/p/13557002.html