动态规划之数字三角形问题

问题描述
在数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或者右下走。只需要求出这个最大和即可。不必给出具体路径。
三角形的行数大于1小于等于100,数字为0-99
输入格式
5 //三角形行数。下面是三角形
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
要求输出最大和

样例输入

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

样例输出

30

算法思想
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
在这里插入图片描述
右边是maxsum数组,要求其值,这个数组中每一个元素能代表其到最底边的最大和,一开始,底边的数字到底边的最大和我们就能求出来,2这个数字到底边的最大和应该是4和5这两个里面比较大的那一个加上它,也就是7,同理,7应该加上5就是12,4加上6应该是10.所以倒数第二行的最大和我们就可以算出来了,同理,往上推,可以得到第一层到底边的最大和为30,如图所示。
整个过程是从最底层最大和开始,一层一层的往上推,每次找两个就能推出上面一个,这一层推出来就能把下一层写出来
在这里插入图片描述

程序代码

#include<iostream>
#include<algorithm>
using namespace std;
#define MAXSIZE 10
int n;
int d[MAXSIZE][MAXSIZE];
int maxSum[MAXSIZE][MAXSIZE];		//存储从某一点到最底边的最大路径值 

int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=i;j++){
			cin>>d[i][j];
			//初始化maxsum数组,当未被计算时,其值为-1 
			maxSum[i][j]=-1;	
		}
	}
	//已知初始条件,最后一层到底边的最大值等于自己 
	for(int i=1;i<=n;i++){
		maxSum[n][i]=d[n][i];
	}
	//从最下面一层开始计算maxsum数组的值 
	for(int i=n-1;i>=1;i--){
		for(int j=1;j<=i;j++){
			//某层maxsum数组的值等于下边和右下边的maxsum值加上自己的最大值 
			maxSum[i][j]=max(maxSum[i+1][j],maxSum[i+1][j+1])+d[i][j];	
		}
	}
	cout<<maxSum[1][1];
	return 0;
}


  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值