如下图是一个数塔,从顶部出发在每一个节点可以选择向左或者向右走,一直走到底层,要求找出一条路径,使得路径上的数字之和最大。

思路分析:

在用动态规划考虑数塔问题时可以自顶向下的分析,自底向上的计算。

从顶点出发时到底向左走还是向右走应取决于是从左走能取到最大值还是从右走能取到最大值,只要左右两道路径上的最大值求出来了才能作出决策。同样的道理下一层的走向又要取决于再下一层上的最大值是否已经求出才能决策。这样一层一层推下去,直到倒数第二层时就非常明了。

所以第一步对第五层的数据,做如下四次决策:
如果经过第四层2,则在第五层的19和7中肯定是19;
如果经过第四层18,则在第五层的7和10中肯定是10;
如果经过第四层9,则在第五层的10和4中肯定是10;
如果经过第四层5,则在第五层的4和16中肯定是16;

经过一次决策,问题降了一阶。5层数塔问题转换成4层数塔问题,如此循环决策…… 最后得到1阶的数塔问题。
算法实现:首先利用一个二维数组data存储数塔的原始数据(其实我们只使用数组data一半的空间,一个下三角矩阵),然后利用一个中间数组dp存储每一次决策过程中的结果(也是一个下三角矩阵)。
初始化dp,将data的最后一层拷贝到dp中。dp[n][j] = data[n][j] (j = 1, 2, …, n) 其中,n为数塔的层数。
在动态规划过程汇总,我们有dp[i][j] = max(dp[i+1][j], dp[i+1][j+1]) + data[i][j],最后的结果保存在dp[0][0]中。

代码实现(c语言)

#include <stdio.h>
#include <stdlib.h>
int maxdata(int data1,int data2)
{if(data1>data2)return data1;elsereturn data2;}int main()
{int  node;int op[5][5]={0};//将其初始化为0int data[5][5]={9, 0, 0, 0, 0,12,15, 0, 0, 0,10, 6, 8, 0, 0,2,18, 9, 5, 0,19, 7,10, 4,16};int n=5,i,j,temp=0;//n为第几层for(j=0;j<n;j++){op[n-1][j]=data[n-1][j];}//初始化op数据,data最底层赋值给op最底层;其余还是为0for(i=3;i>=0;i--)//从data[3][0]开始,也就是2;比较19和7{for(j=0;j<=i;j++){temp=maxdata(op[i+1][j],op[i+1][j+1]);op[i][j]=temp+data[i][j];}}
for(i=0;i<=4;i++)
{for(j=0;j<=4;j++){printf("%d ",op[i][j]);}printf("\n");
}printf("路径之和最大为:%d\n",op[0][0]);
printf("最大路径:%d",data[0][0]);
for(i=1,j=0;i<n;i++)
{node=op[i-1][j]-data[i-1][j];if(node==op[i][j+1])++j;printf("——>%d",data[i][j]);
}return 0;
}

运行结果

算法-数塔问题-c语言相关推荐

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

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

  2. 算法.动态规划 导航/数塔取数字问题

    目录 前言 从1+1开始 总结下概念 地图到图 回头看 代码 动态规划经典问题 前言 下面的概念和公式可能会吓到你,看不懂没关系,就是让你恶心的.反正我看着也挺恶心,专业就是让你看不懂,看懂了怎么能叫 ...

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

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

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

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

  5. 动态规划算法之数塔问题

    package cn.gldwolf.bigdata;/* 3 12 56 23 4 78 34 69 34 19 12 3 54 12 34 *//* 思路:从最底层往上走,判断下层两个节点中的最大 ...

  6. 55 - 算法 -动态规划 -数塔问题 感觉都是数组建模 递推方法规则

    //模板#include <iostream> #include <cstdio> #include <string> using namespace std;/* ...

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

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

  8. HDU2084 数塔【DP】

    数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  9. 算法和数据结构(golang语言实现)

    算法和数据结构(golang语言实现) 第1节 选择.冒泡.插入.复杂度 选择排序 选择排序 时间复杂度为O(N^2) 额外空间复杂度O(1) 过程: arr[0-N-1]范围上,找到最小值所在的位置 ...

最新文章

  1. 安卓项目查手机电量功能_不做低头族,一键开启手机上的这一功能,手机信息随时查...
  2. 对图像数据最主要的预处理: Resize
  3. CTFshow 文件上传 web165
  4. 谁会C语言,谁会c语言程序设计
  5. dedecms 备份和恢复的完整流程
  6. mycat从0到成功进行分表操作
  7. 分享一个基于.NET6包含DDD,ES,CQRS等概念的开源项目
  8. 如何在 ASP.NET CORE 中获取客户端 IP ?
  9. P4294-[WC2008]游览计划【斯坦纳树】
  10. 【dfs】栅栏的木料(2012特长生 T4)
  11. docker之使用supervisor管理多个进程
  12. 内容页嵌套母版页时,内容页如何调用css和javascript
  13. 在10万以内判断,一个整数加上100后是一个完全平方数,再加上168又是一个完全平方数,求该数...
  14. 操作系统服务:其它模块
  15. H5 新特性之 fileReader 实现本地图片视频资源的预览
  16. (cocos2dx-3.3)3D坐标系
  17. HR人力资源系统软件价格?哪家HR人力管理系统好
  18. FRM-18108和FRM-10102解决方法
  19. 1.1股票数据预处理练习
  20. 解决表格刷新时抖动闪烁问题

热门文章

  1. 盘数几则热门微信好友诈骗套路
  2. 解决微信群服务管理难题,只需要一个助手
  3. 跟我学Python图像处理丨图像特效处理:毛玻璃、浮雕和油漆特效
  4. 解决can't handle non absolute segment in ljmp 的问题
  5. SpringBoot使用分布式锁
  6. 全球与中国LED检查灯市场深度研究分析报告
  7. 国考计算机及其应用科目,2018国家公务员考试专业科目考试大纲(计算机类)
  8. excel数据分析案例
  9. k30pro杀进程严重怎么解决_iPhonex发烫严重不开机怎么办?苹果X开机不充电关机充电解决办法...
  10. 巧用计算机课件,如何用电脑录制ppt讲解视频?