P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles简单的DP递推
Posted 幽殇默
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles简单的DP递推相关的知识,希望对你有一定的参考价值。
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;
}
以上是关于P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles简单的DP递推的主要内容,如果未能解决你的问题,请参考以下文章
P1216 [IOI1994][USACO1.5]数字三角形 Number Triangles
P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles简单的DP递推
洛谷P1216 [USACO1.5]数字三角形 Number Triangles
洛谷 P1216 [USACO1.5]数字三角形 Number Triangles