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. 数字三角形的主要内容,如果未能解决你的问题,请参考以下文章

acwing 898. 数字三角形 [线性dp]

AcWing 898. 数字三角形(线性DP)

算法基础课题目时间

动态规划线性dp问题总结:数字三角形最长上升子序列最长公共子序列最短编辑距离 题解与模板

线性DP的几种模型和例题

JavaScript笔试题(js高级代码片段)