链接: link.
解法一:
个人认为最好的解法,也是最容易懂的,自底而上dp,是最好的方式,f[1][1]直接就是答案
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 600;
int n;
int f[N][N];
signed main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i =1;i<=n;++i){
for(int j = 1;j<=i;j++){
cin>>f[i][j];
}
}
for(int i = n-1;i>=1;i--){
for(int j = 1;j<=i;j++){
f[i][j] = f[i][j] + max(f[i+1][j],f[i+1][j+1]);
}
}
cout<<f[1][1];
return 0;
}
解法二:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int inf = 1e18;
const int N = 1009;
int n,m,a[N][N],f[N][N];
signed main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i = 1;i<=n;i++){
for(int j =1;j<=i;j++){
cin>>a[i][j];
}
}
//三角形周围都要覆盖一层极小值,保证边界点dp的正确性
for(int i = 0;i<=n;i++){
for(int j = 0;j<=i+1;j++){
f[i][j] = -inf;
}
}
f[1][1] = a[1][1];
for(int i = 2;i<=n;i++){
for(int j = 1;j<=i;j++){
//挺好懂,选左上下来,还是正上
f[i][j] = max(f[i-1][j-1]+a[i][j],f[i-1][j]+a[i][j]);
}
}
int ok = -inf;
for(int i = 1;i<=n;i++) ok = max(ok,f[n][i]);
cout<<ok;
return 0;
}