题目链接

思路(上到下):
①从上往下递推:
f[i][j] = max(f[i-1][j] + g[i][j], f[i-1][j-1]+g[i][j])
②对最后一层,遍历一下,找到最大的答案。
代码(上到下):
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1010;int n;
int g[N][N];
int f[N][N];signed main(){cin >> n;for(int i = 1; i <= n; i++){for(int j = 1; j<=i; j++){cin >> g[i][j];}}//dpf[1][1] = g[1][1];for(int i = 2; i <= n; i++){for(int j = 1; j <= i; j++){f[i][j] = max(f[i-1][j]+g[i][j], f[i-1][j-1]+g[i][j]);}}int ans = 0;for(int i = 1; i <= n; i++){ans = max(ans, f[n][i]);}cout << ans << endl;return 0;
}
思路(从下到上):
①从下往上递推:
f[i][j] = max(f[i+1][j]+g[i][j], f[i+1][j+1]+g[i][j]);
②答案就是顶点:f[1][1]
代码(从下到上):
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1010;int n;
int g[N][N];
int f[N][N];signed main(){cin >> n;for(int i = 1; i <= n; i++){for(int j = 1; j<=i; j++){cin >> g[i][j];}}//dp 下到上for(int i = n; i >= 1; i--){for(int j = 1; j <= i; j++){f[i][j] = max(f[i+1][j]+g[i][j], f[i+1][j+1]+g[i][j]);}}cout << f[1][1] << endl;return 0;
}