898. 数字三角形
Posted 幽殇默
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了898. 数字三角形相关的知识,希望对你有一定的参考价值。
https://www.acwing.com/problem/content/900/
正推方法:
状态转移方程: f[i][j]=max(f[i-1][j-1]+a[i][j],f[i-1][j]+a[i][j]);
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=510;
const int INF=0x3f3f3f3f;
int a[N][N],f[N][N],n;
int main(void)
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
cin>>a[i][j];
}
}
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 ans=0;
for(int i=1;i<=n;i++) ans=max(ans,f[n][i]);
cout<<ans<<endl;
return 0;
}
倒着推:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=510;
int a[N][N],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=i;j>=1;j--)
{
f[i][j]=max(f[i+1][j+1]+f[i][j],f[i+1][j]+f[i][j]);
}
}
cout<<f[1][1]<<endl;
return 0;
}
以上是关于898. 数字三角形的主要内容,如果未能解决你的问题,请参考以下文章