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

洛谷 P1216 [USACO1.5]数字三角形 Number Triangles(水题日常)

数字三角形