题目:数字三角形
898. 数字三角形 - AcWing题库
看某个点,是从那些路径过来的去分析
分析1:
代码1:(顺序正推,二维dp数组)
#include<bits/stdc++.h>
using namespace std;
const int N = 550;
int a[N][N], dp[N][N];
int main() {
int n;
cin >> n;
for(int i = 1; i <= n; i ++) {
for(int j = 1; j <= i; j ++) {
cin >> a[i][j];
}
}
for(int i = 1; i <= n; i ++) {
for(int j = 1; j <= i; j ++) {
if(j == 1) dp[i][j] = dp[i-1][j];
else if(i == j) dp[i][j] = dp[i-1][j-1];
else {
dp[i][j] = max(dp[i-1][j],dp[i-1][j-1]);
}
dp[i][j] += a[i][j];
}
}
// 最大权值和在最后一行找
int maxx = dp[n][n];
for(int j = 1; j < n; j ++) {
if(maxx < dp[n][j]) maxx = dp[n][j];
}
cout << maxx << endl;
return 0;
}
分析2:
代码2(倒序递推,二维dp数组)
#include<bits/stdc++.h>
using namespace std;
const int N = 550;
int a[N][N], dp[N][N];
int main() {
int n;
cin >> n;
for(int i = 1; i <= n; i ++) {
for(int j = 1; j <= i; j ++) {
cin >> a[i][j];
}
}
for(int i = n; i > 0; i --) {
for(int j = 1; j <= i; j ++) {
dp[i][j] = max(dp[i+1][j],dp[i+1][j+1]) + a[i][j];
}
}
cout << dp[1][1];
return 0;
}
分析3
代码3(正序空间优化,逐层更新法)
#include<bits/stdc++.h>
using namespace std;
const int N = 550;
int a[N], dp[N];
int main() {
int n;
cin >> n;
for(int i = 1; i <= n; i ++) {
for(int j = 1; j <= i; j ++) {
cin >> a[j];
}
//倒叙防止覆盖
for(int j = i; j > 0; j --) {
if(j == 1) dp[j] = dp[j];
else if(j == i) dp[j] = dp[j-1];
else dp[j] = max(dp[j],dp[j-1]);
dp[j] += a[j];
}
}
int maxx = dp[n];
for(int i = 1; i < n; i ++)
if(maxx < dp[i]) maxx = dp[i];
cout << maxx << endl;
return 0;
}