一句话题目:给出一个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; }