https://www.luogu.com.cn/problem/P1216
这是一道非常经典的题目
方法一: 从上到小开始递推 不难得出 f[i][j]=max(f[i-1][j-1],f[i-1][j])+w[i][j]
对于初始化,无需设置。因为这里的值没有负数,故边界不用设置为负无穷。
最后的结果就是在最后一层的所有的结果中取一个max即可。
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int f[N][N],n;
int main(void)
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
cin>>f[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
f[i][j]=max({f[i-1][j-1],f[i-1][j]})+f[i][j];
int ans=0;
for(int i=1;i<=n;i++) ans=max(ans,f[n][i]);
cout<<ans;
return 0;
}
方法二: 倒着推,即从下往上推,不难得出 f[i][j]=max(f[i+1][j],f[i+1][j+1])+w[i][j]
这样的好处是,结果就是f[1][1]
,不用再取一层的结果取一个max了
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int f[N][N],n;
int main(void)
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
cin>>f[i][j];
for(int i=n;i>=1;i--)
for(int j=1;j<=i;j++)
f[i][j]=max({f[i+1][j],f[i+1][j+1]})+f[i][j];
cout<<f[1][1];
return 0;
}