0
点赞
收藏
分享

微信扫一扫

M - 数塔问题(DP题)

Silence潇湘夜雨 2022-01-10 阅读 53

题意很好理解,讲讲思路吧,dp的状态转移方程主要是看+上一层的左边还是+上一层的右边会有更大的价值,有点树的味道,dp到最后的叶子节点再取叶子节点的max。

有一点需要特别特别注意的是,要初始化的时候加上一个每一层最左边和最右边的初始虚点(负无穷,不然的话,最左边和最右边的两个点是无法为dp提供任何价值的)

#include<bits/stdc++.h>
using namespace std;
int n,i,j,k,a[110][110],dp[110][110];
int ans=-0x3f3f3f3f;//int ans=-1<<30;
int main(){
	cin>>n;
	for(i=1;i<=n;i++){
		for(j=1;j<=i;j++){
			cin>>a[i][j];
		}
	}for(i=1;i<=n;i++){
		dp[i][i+1]=ans;
		dp[i][0]=ans;
	}
	for(i=1;i<=n;i++){
		for(j=1;j<=i;j++){
			dp[i][j]=max(dp[i-1][j]+a[i][j],dp[i-1][j-1]+a[i][j]);
		}
	}for(i=1;i<=n;i++){
		ans=max(ans,dp[n][i]);
	}cout<<ans;
}
举报

相关推荐

0 条评论