C简单动态规划——爬数塔
问题描述:
小明在某个角落发现了一座由数字组成的斜塔,他I想到塔顶去看看。小明可以从底层任意一个数字出发逐层爬上去,每次可以爬至上一层数字上或者上一层左边相邻的数字上(第1列只能爬至正上方上一层的数字上)。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
如上图,小明如果从最下层也就是第5层的数字4向上爬,只能爬到上一层即第4层的2号数字上;如果从数字2爬,可以爬到其正上方的数字4上,也可以爬到数字7上;如果从最右边的数字5爬,则只能爬到其左上方的数字4上。
现在小明想知道,他从最下层开始爬到塔顶,如何选择爬上去的路径,使该路径经过的数字和最大?
输入:
多组测试数据。
每组测试数据的第一行是一个整数n(1≤n≤100)表示数塔的高度,接下来用n行数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间[0,99]内。
输出:
对于每个组测试数据,输出一个整数表示得到的最大和,每个输出占一行。
样例输入:
5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
样例输出:
30
————————————————————————————————————
由于每个位置的数字是随机的,所以大概没有一个固定的路线来求得最大值,这意味着我们要把所有路线都走一遍,但如果把每条路线独立出来算,会造成大量的重复计算,如走5-4-0-8-7中的4-0-8-7会在6-4-0-8-7中又一遍计算,如果塔的层数很大时,重复计算量是非常大的,因此我们要想办法记录已经进行过的计算。
我们可以观察到,越在上层的数字被重复计算的次数越多,所以我们要优先记录上层,才能保证最大化减少计算量。
那我们要记录上面呢?我们最终要得到的是路径数字最大和,那我们应该记录从某个位置爬塔能得到的最大数字和,一旦得到这个,下一层的就完全可以只依靠上层记录的值就得到它能达到的最大值,而无需爬到最顶层。
这就是思路,接下来是敲代码了。
#include <stdio.h>
int arr[100][100]; //创建二维数组用来记录每个位置能达到的最大值
void getsum(int); //个人习惯用函数来处理
int main()
{int n;while(scanf("%d",&n)!=EOF){getsum(n);}}void getsum(n)
{//将数塔输入数组for(int i=0;i<n;i++){for(int j=0;j<=i;j++){scanf("%d",&arr[i][j]);}}//开始从上往下计算每个位置能达到的最大值for(int i=1;i<n;i++){arr[i][0]+=arr[i-1][0];for(int j=1;j<i;j++){arr[i][j]+=(arr[i-1][j]>arr[i-1][j-1]?arr[i-1][j]:arr[i-1][j-1]);}arr[i][i]+=arr[i-1][i-1];}//检测最底层每个位置能够到达的最大值,来得到整个塔能得到的最大值int sum=arr[n-1][0];for(int i=1;i<n;i++){sum=arr[n-1][i]>sum?arr[n-1][i]:sum;}//将结果输出printf("%d\n",sum);
}
这是一道较为简单的动态规划题,适合新手对动态规划进行理解。
C简单动态规划——爬数塔相关推荐
- 算法.动态规划 导航/数塔取数字问题
目录 前言 从1+1开始 总结下概念 地图到图 回头看 代码 动态规划经典问题 前言 下面的概念和公式可能会吓到你,看不懂没关系,就是让你恶心的.反正我看着也挺恶心,专业就是让你看不懂,看懂了怎么能叫 ...
- 算法学习(动态规划)- 数塔问题
前言 之前碰到了扔鸡蛋问题(给你2个鸡蛋,在100层楼上扔,要求想出一个好的策略,去测出哪一层楼开始鸡蛋就会碎掉),一直摸不着头脑.后来才知道可以使用"动态规划"这种思想(或者叫算 ...
- c语言动态规划算法数塔问题,动态规划之数塔问题...
这么简单的DP问题就不要再讲了吧...无奈楼翰诚大佬的数塔问题是在没讲清楚,也只好自己写一个... 数塔问题嘛...已经有很多大佬讲过了,比如这位令人熟悉的大佬 BUT! 实际上关于这种从下往上的DP ...
- 动态规划2(数塔问题)
数塔问题是二维情况下动态规划的经典问题,下面以洛谷的一个例题来分析数塔问题以及动态规划:原题链接 题目描述 观察下面的数字金字塔.写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大 ...
- 杭电ACM 动态规划 1 数塔
Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大 ...
- python 动态规划 数塔_数塔问题,简单的动态规划算法
/* 数塔问题: 9 12 15 10 6 8 2 18 9 5 19 7 10 4 16 有形如图所示的数塔,从顶部出发,在每一结点可以选择向左走或是向右走, 一直走到底层,要求找出一条路径,使路径 ...
- 动态规划--数塔问题
动态规划–数塔问题 今天学习了动态规划的数塔问题,老师给我们讲了三种方法. (1)第一种方法是原始的递归,就是从上往下看一个n层塔的最大路径问题可以转化为选出左右两个n-1层塔的最大路径问题的较大值, ...
- 算法-数塔问题-c语言
如下图是一个数塔,从顶部出发在每一个节点可以选择向左或者向右走,一直走到底层,要求找出一条路径,使得路径上的数字之和最大. 思路分析: 在用动态规划考虑数塔问题时可以自顶向下的分析,自底向上的计算. ...
- c语言字母塔问题,(最新整理)数塔问题C语言
<(最新整理)数塔问题C语言>由会员分享,可在线阅读,更多相关<(最新整理)数塔问题C语言(7页珍藏版)>请在人人文库网上搜索. 1.完整)数塔问题C语言(完整)数塔问题C语言 ...
最新文章
- java 小对话框_创建Java对话框
- linux-压缩与解压缩(gz,zip,tar,jar,war)
- Redis学习笔记--Redis数据过期策略详解
- Android Telephony分析(六) ---- 接口扩展(实践篇)
- ITK:复制过滤器filter
- 数据结构与算法--解决问题的方法- 二叉树的的镜像
- CES 2017前瞻之AI:无人机依旧小巧,机器人主打家庭服务
- javascript判断非空
- sum() over (order by )
- An illegal reflective access operation has occurred警告
- 一款适合减压放松的小游戏
- 为一个理想而奋斗一生
- linux系统多网口聚合配置,linux端口聚合
- 鼠标滚动导航放大缩小
- English trip V1 - 11.What's That? 那是什么?Teacher:Patrick Key:There's/There are
- 解决ublox无法定位问题(一直输出$GxTXT)
- [转帖]深度解析区块链POW和POS的区别
- 各种插值法的python实现
- BiliBili快捷键
- 视图的隐藏显示附加Gilde加载图片模版