问题描述:

小明在某个角落发现了一座由数字组成的斜塔,他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+1开始 总结下概念 地图到图 回头看 代码 动态规划经典问题 前言 下面的概念和公式可能会吓到你,看不懂没关系,就是让你恶心的.反正我看着也挺恶心,专业就是让你看不懂,看懂了怎么能叫 ...

  2. 算法学习(动态规划)- 数塔问题

    前言 之前碰到了扔鸡蛋问题(给你2个鸡蛋,在100层楼上扔,要求想出一个好的策略,去测出哪一层楼开始鸡蛋就会碎掉),一直摸不着头脑.后来才知道可以使用"动态规划"这种思想(或者叫算 ...

  3. c语言动态规划算法数塔问题,动态规划之数塔问题...

    这么简单的DP问题就不要再讲了吧...无奈楼翰诚大佬的数塔问题是在没讲清楚,也只好自己写一个... 数塔问题嘛...已经有很多大佬讲过了,比如这位令人熟悉的大佬 BUT! 实际上关于这种从下往上的DP ...

  4. 动态规划2(数塔问题)

    数塔问题是二维情况下动态规划的经典问题,下面以洛谷的一个例题来分析数塔问题以及动态规划:原题链接 题目描述 观察下面的数字金字塔.写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大 ...

  5. 杭电ACM 动态规划 1 数塔

    Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大 ...

  6. python 动态规划 数塔_数塔问题,简单的动态规划算法

    /* 数塔问题: 9 12 15 10 6 8 2 18 9 5 19 7 10 4 16 有形如图所示的数塔,从顶部出发,在每一结点可以选择向左走或是向右走, 一直走到底层,要求找出一条路径,使路径 ...

  7. 动态规划--数塔问题

    动态规划–数塔问题 今天学习了动态规划的数塔问题,老师给我们讲了三种方法. (1)第一种方法是原始的递归,就是从上往下看一个n层塔的最大路径问题可以转化为选出左右两个n-1层塔的最大路径问题的较大值, ...

  8. 算法-数塔问题-c语言

    如下图是一个数塔,从顶部出发在每一个节点可以选择向左或者向右走,一直走到底层,要求找出一条路径,使得路径上的数字之和最大. 思路分析: 在用动态规划考虑数塔问题时可以自顶向下的分析,自底向上的计算. ...

  9. c语言字母塔问题,(最新整理)数塔问题C语言

    <(最新整理)数塔问题C语言>由会员分享,可在线阅读,更多相关<(最新整理)数塔问题C语言(7页珍藏版)>请在人人文库网上搜索. 1.完整)数塔问题C语言(完整)数塔问题C语言 ...

最新文章

  1. java 小对话框_创建Java对话框
  2. linux-压缩与解压缩(gz,zip,tar,jar,war)
  3. Redis学习笔记--Redis数据过期策略详解
  4. Android Telephony分析(六) ---- 接口扩展(实践篇)
  5. ITK:复制过滤器filter
  6. 数据结构与算法--解决问题的方法- 二叉树的的镜像
  7. CES 2017前瞻之AI:无人机依旧小巧,机器人主打家庭服务
  8. javascript判断非空
  9. sum() over (order by )
  10. An illegal reflective access operation has occurred警告
  11. 一款适合减压放松的小游戏
  12. 为一个理想而奋斗一生
  13. linux系统多网口聚合配置,linux端口聚合
  14. 鼠标滚动导航放大缩小
  15. English trip V1 - 11.What's That? 那是什么?Teacher:Patrick Key:There's/There are
  16. 解决ublox无法定位问题(一直输出$GxTXT)
  17. [转帖]深度解析区块链POW和POS的区别
  18. 各种插值法的python实现
  19. BiliBili快捷键
  20. 视图的隐藏显示附加Gilde加载图片模版

热门文章

  1. 枫叶HD高清视频转换器 V10.2.2.0 官方安装版
  2. 一物一码(2): 一物一码之【红包那点事】
  3. MySQL B+树 BTree原理、增删改(详细)
  4. 高度自律学习者的app
  5. unity 条目换位效果_Unity AI主题博客条目
  6. Java程序设计——模拟行星运动
  7. 计算两个向量的逆时针夹角
  8. uniapp唤醒手机地图app
  9. 见丰知夏|国漫鼻祖丰子恺,数字藏品独家发售
  10. 《程序员练习生》第5期 学习编程的乐趣