欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数字三角形【线性DP】

程序员文章站 2022-07-12 21:30:20
...

给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。

        7
      3   8
    8   1   0
  2   7   4   4
4   5   2   6   5

输入格式

第一行包含整数n,表示数字三角形的层数。

接下来n行,每行包含若干整数,其中第 i 行表示数字三角形第 i 层包含的整数。

输出格式

输出一个整数,表示最大的路径数字和。

数据范围

1≤n≤5001≤n≤500,
−10000≤三角形中的整数≤10000−10000≤三角形中的整数≤10000

输入样例:

5
7
3 8
8 1 0 
2 7 4 4
4 5 2 6 5

输出样例:

30

考虑当前点来自左上还是右上

转移方程:dp[i][j]=max(dp[i-1][j-1]+a[i][j],dp[i-1][j]+a[i][j]);

#include<iostream>
using namespace std;
const int N=10010,INF=1e9+10;
int dp[N][N],a[N][N];
int main()
{
	int n;
	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++)
	dp[i][j]=-INF;//最右边点的右上不存在,j取到i+1,初始化为负无穷
	
	dp[1][1]=a[1][1];
	for(int i=2;i<=n;i++)
	 for(int j=1;j<=i;j++)
	 {
	 	dp[i][j]=max(dp[i-1][j-1]+a[i][j],dp[i-1][j]+a[i][j]);
	 }
	 int ans=-INF;
	 for(int i=1;i<=n;i++)
	 ans=max(ans,dp[n][i]);
	 cout<<ans<<endl;
	 return 0;
}

 

相关标签: AcWing 动态规划