题意很好理解,讲讲思路吧,dp的状态转移方程主要是看+上一层的左边还是+上一层的右边会有更大的价值,有点树的味道,dp到最后的叶子节点再取叶子节点的max。
有一点需要特别特别注意的是,要初始化的时候加上一个每一层最左边和最右边的初始虚点(负无穷,不然的话,最左边和最右边的两个点是无法为dp提供任何价值的)
#include<bits/stdc++.h>
using namespace std;
int n,i,j,k,a[110][110],dp[110][110];
int ans=-0x3f3f3f3f;//int ans=-1<<30;
int main(){
cin>>n;
for(i=1;i<=n;i++){
for(j=1;j<=i;j++){
cin>>a[i][j];
}
}for(i=1;i<=n;i++){
dp[i][i+1]=ans;
dp[i][0]=ans;
}
for(i=1;i<=n;i++){
for(j=1;j<=i;j++){
dp[i][j]=max(dp[i-1][j]+a[i][j],dp[i-1][j-1]+a[i][j]);
}
}for(i=1;i<=n;i++){
ans=max(ans,dp[n][i]);
}cout<<ans;
}