dp_基础_数字三角形


7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
问:最大和是多少。


思路图解


设dp[i][j]
i 为第i 行,j 为 第i行的第j个数字时。
则有
无后效性:向下选择的时候不会影响之前的选择
子问题重叠:使用dp[i-1] 来代表上一行已经选好的结果
最优子结构:dp[i][j] = max(dp[i-1][j-1],dp[i-1][j]) + nums[j];


此外可用滚动数组来优化


附:http://poj.org/problem?id=1163 ac答案

#define NMAX 110

int nums[NMAX];
int ret[NMAX];

int main(){
	int n;
	scanf("%d",&n);
	int retn = 0;
	for( int i=0;i<n;++i){
		for( int j=0;j<=i;++j){
			scanf("%d",&nums[j]);
		}
		for( int j=i;j>0;--j){//使用倒序,如果是正序,则需要2个数组
			ret[j] = max(ret[j-1]+nums[j],ret[j]+nums[j]);
			retn = max(retn,ret[j]);
		}
		ret[0] += nums[0];
		retn = max(retn,ret[0]);
	}
	printf("%d\n",retn);
}
posted @ 2022-05-06 12:31  传说中的水牛  阅读(11)  评论(0编辑  收藏  举报