一:分析

先说一下相关动态规划的一些概念,参考下方博文。

原文链接:https://blog.csdn.net/every__day/article/details/88174082

“一个模型三个特征”理论的讲解
动态规划作为一个非常成熟的算法思想,很多人对此做了非常全面的总结,我把这部分理论总结为“一个模型三个特征”。

首先,“一个模型”指的是动态规划适合解决问题的模型。我把这个模型定义为“多阶段决策最优解模型”。

具体来说,我们一般是用动态规划来解决最优问题。而解决问题的过程,需要经历多个决策阶段。每个决策阶段都对应一组状态。然后我们寻找一组决策序列,经过这组决策序列,能够产生最终期望求解的最优值

“三个特征”,分别是最优子结构、无后效性和重复子问题。这三个概念比较抽象,逐一解释一下。

1、最优子结构

最优子结构指的是,问题的最优解包含子问题的最优解。反过来说就是,我们可以通过子问题的最优解,推导出问题的最优解。如果我们把最优子结构,对应到我们前面定义的动态规划问题模型上,那我们也可以理解为,后面阶段的状态可以通过前面状态推导出来。

2、无后效性

无后效性,有两层含义,第一层含义是,在推导后面阶段状态的时候,我们只关心前面阶段的状态值,不关心这个状态是怎么一步步推导出来的。第二层含义是,某阶段状态一旦确定,就不受之后阶段的决策影响。无后效性是一个非常“宽松”的要求。只要满足前面提到的动态规划问题模型,其实基本上都会满足无后效性。

3、重复子问题

这个概念,前面一节,已经多次提到。用一句话概括就是: 不同的决策序列,到达某个相同的阶段时,可能会产生重复的状态。

正常分析很容易想到,自顶向下每次遇到两个分支,每次选取大的分支进行加和,一直到最底层即得到最优解。

但是做动态规划我们一定要注意子问题的解是不是真的可以构成原问题的解。

显而易见在这里回答是否定的。那我们就设法使之满足最优子结构。就是说我们新开辟一个内存空间,去存储对于数塔中每一个数字对于到达最低端的路径最大值。计算完成后答案随之复现。

我们必须选取所有可能的情况中最合适的一个,而不是顺着一个不完全的判定标准走一条路。

这里有两种方式,下面给出每个位置到最低端的最大路径值,这里采取第二种,因为更简单。

输入:

5

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

①:自顶向下

②:自低向上

顶部值即为所求值。

输出:

二:代码

如下:

#include<stdio.h>int r,max,a[1002][1002],F[1002][1002];//a存储原始三角形信息,F存储最大路径权值和 ,此算法自底向上做
main()
{scanf("%d",&r);for(int i=1;i<=r;i++)for(int j=1;j<=i;j++){scanf("%d",&a[i][j]);F[i][j]=a[i][j];}for(int i=r-1;i>0;i--)//二维数组最后一行 {for(int j=1;j<=i;j++)//二维数组第一列 {if(F[i+1][j]>F[i+1][j+1])//自底向上依次比较取最大值加和 {max=F[i+1][j];}else{max=F[i+1][j+1];}F[i][j]+=max;}}printf("\n\n");printf("*********F[i][j]到最低端最大路径和**********\n\n"); //输出F[] [],F[i][j]到最低端最大权值 for(int i=1;i<=r;i++){for(int j=1;j<=i;j++){if(F[i][j]<10)//为了统一格式,美观{printf("%d  ",F[i][j]); }else{printf("%d ",F[i][j]); }}printf("\n");}printf("\n\n**************最终结果为:***************\n\n");       printf("%d",F[1][1]);//输出最顶端到最低端的最大权值
}

动态规划——数字三角形C语言相关推荐

  1. 【动态规划】数字三角形c语言

    本学期的的算法实践课的实验作业.写的不好请大家多多指教. [题目] 试设计一个算法,计算出从三角形的顶到底的一条路径,使该路径经过的数字总和最大. 数据输入: 由文件input.txt提供输入数据.文 ...

  2. 动态规划-数字三角形问题

    有一个由非负整数组成的三角形,第一行只有一个数,除了最下行之外每个数的左下方和右下方各有一个数. 1 3 2 4 10 1 4 3 2 20 从第一行的数开始,每次可以往左下或右下走一格,直到走到最下 ...

  3. 算法设计与分析——动态规划——数字三角形问题

    数字三角形问题 1.题目描述:给定一个由n行数字组成的数字三角形,如图3-7所示.设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大. 算法设计:对于给定的由n行数字组成的数字 ...

  4. 七:动态规划-数字三角形

    问题: 数字三角形   问题描述 (图3.1-1)示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大. ●每一步可沿左斜线向下或右斜线向下走: ●1&l ...

  5. [AcWing] 1018. 最低通行费(C++实现)数字三角形模型

    [AcWing] 1018. 最低通行费(C++实现)数字三角形模型 1. 题目 2. 读题(需要重点注意的东西) 3. 解法 4. 可能有帮助的前置习题 5. 所用到的数据结构与算法思想 6. 总结 ...

  6. 数字三角形路径最小值c语言题目,算法学习——动态规划之点数值三角形的最小路径...

    算法描述在一个n行的点数值三角形中,寻找从顶点开始每一步可沿着左斜或者右斜向下直到到达底端,使得每个点上的数值之和为最小 右图为一个4行的点数值三角形 算法思路接收用户输入行数n 使用一个二维数组a[ ...

  7. C语言数字三角形(动态规划)

    题目 总时间限制: 1000ms 内存限制: 65536kB 描述 图1给出了一个数字三角形.从三角形的顶部到底部有很多条不同的路径.对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到 ...

  8. C语言蓝桥杯刷题:数字三角形

    题目链接 解题思路: 该题是一道经典的动态规划,对于这样的数字三角形, 我们用一个数组arr存储各个位置的数字,再用另一个数组brr来记录到该位置的最大路径 对于图中的7,我们用数组保存就是arr[0 ...

  9. C++数字三角形问题(动态规划)

    一.问题描述 ★问题描述:给字一个由n行数字组成的数字三角形(等腰三角形).试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大. ★算法设计:对于给定的由n行数字组成的数字三 ...

最新文章

  1. 贪心:remove K digits移除K个数字
  2. 【PAT乙级】 1018 锤子剪刀布 (20 分)
  3. 【示例】solr添加文档/删除文档/简单查询/多条件查询
  4. javascript 基础 转
  5. PHP内核通用网站后台权限管理系统源码
  6. SQL Server 2019中的图形数据库功能–第1部分
  7. 说人话很难。。。。。。
  8. 非常强大的射击动作游戏源码完整版
  9. 国内的Android SDK镜像
  10. Pannellum:实例之自定义热点信息
  11. 移远EC20串口使用阻塞问题
  12. STM32F103—有关SIM900A模块的使用
  13. Ubuntu20.04--开机自动运行脚本(命令)--方法/实例
  14. MYSQL 命令行大全 (简洁、明了、全面)
  15. 模拟海_学前教育系未来之星 课堂模拟大赛
  16. 新华三杯复赛实验赛题解析IPv4 BGP路由部署+路由优化部署
  17. kafka消费者如何才能从头开始消费某个topic的全量
  18. imagex工具整合window11的wim镜像
  19. oracle进入asm命令,Oracle常用ASM操作命令
  20. 机智云移植STM32标准库

热门文章

  1. tomcat宕机无法响应问题研究解决
  2. oracle数据库导入dmp文件,两种方法
  3. 微服务 Nacos 注册中心 基础配置
  4. 绿盟rsasnx3_绿盟RSASNX3-S远程安全评估系统V6.0
  5. 智慧管廊解决方案-最新全套文件
  6. 计算机能换显卡吗,联想台式机可以更换显卡
  7. 简单vsftpd安装配置和 ftp客户端操作笔记
  8. QT QTabWidget 使用
  9. 这份网络安全入门笔记(共327页),助你步入安全门槛
  10. css实现图片翻转动画