数塔问题--动态规划问题--递推问题

本文介绍了一种通过动态规划解决数塔路径最大和问题的方法。该问题要求在数塔中找到一条路径使得路径上的数值之和最大。文章详细解释了自顶向下分析问题并自底向上计算解决方案的过程,并给出了具体的实现代码。

图是一个数塔,要求找出一条路径,使路径上的数组和最大

在这里插入图片描述

【Input】
第一行是一个整数N,表示数塔的高度,接下来用N行数字表示数塔,其中第i行有i个整数,且所有的整数均在区间[0,99]内

【Output】
输出可能得到的最大和

【Sample Input】
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

【Sample Output】
30

问题分析:
这道题目如果使用贪婪算法不能保证找到真正的最大和。
在用动态规划考虑数塔问题时可以自顶向下的分析,自底向上的计算。
从顶点出发时到底向左走还是向右走应取决于是从左走能取到最大值还是从右走能取到最大值,只要左右两道路径上的最大值求出来了才能作出决策。同样的道理下一层的走向又要取决于再下一层上的最大值是否已经求出才能决策。这样一层一层推下去,直到倒数第二层时就非常明了。
所以第一步对第五层的8个数据,做如下四次决策:
如果经过第四层2,则在第五层的19和7中肯定是19;
如果经过第四层18,则在第五层的7和10中肯定是10;
如果经过第四层9,则在第五层的10和4中肯定是10;
如果经过第四层5,则在第五层的4和16中肯定是16;
经过一次决策,问题降了一阶。5层数塔问题转换成4层数塔问题,如此循环决策…… 最后得到1阶的数塔问题。

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main(){
	int cnt[255][255];
	int n;
	cin >> n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=i;j++){
			cin >> cnt[i][j];
		}
	} 
	for(int i=n-1;i>=1;i--){
		for(int j=1;j<=i;j++){
			if(cnt[i+1][j]>=cnt[i+1][j+1]) cnt[i][j]+=cnt[i+1][j];
			else cnt[i][j]+=cnt[i+1][j+1];
		}
	}
	cout << cnt[1][1];
	return 0;
} 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值