对于一个位置 其的最优 为h (i,j)
下一个位置(i+1,j)和f(i+1,j+1)
除了边角位,每个位置都会算俩次,不用担心存不到最大值,同时对于 (1,1)需要有初始值
h[i + 1][j] = max(h[i + 1][j], h[i][j] + a[i + 1][j]);
h[i + 1][j + 1] = max(h[i + 1][j + 1], h[i][j] + a[i + 1][j + 1]);
最后在最后一行找到最值输出
以后可以优化,后面学了再说
#include <bits/stdc++.h>
using namespace std;
int i, j, k;
int a[10001][10001];
int h[10001][10001] ; //记录答案
int n;
int x, y;
//5
//7
//3 8
//8 1 0
//2 7 4 4
//4 5 2 6 5
int main() {
cin >> n;
for (i = 1; i <= n; i++)
for (j = 1; j <= i; j++) {
cin >> a[i][j];
}
h[1][1] = a[1][1];
int maxans = 0;
for (i = 1; i <= n; i++)
for (j = 1; j <= i; j++) {
h[i + 1][j] = max(h[i + 1][j], h[i][j] + a[i + 1][j]);
h[i + 1][j + 1] = max(h[i + 1][j + 1], h[i][j] + a[i + 1][j + 1]);
}
for (i = 1; i <= n; i++) {
maxans = max(maxans, h[n][i]);
}
cout << maxans;
}