一:分析

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

原文链接: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. 用中文传话游戏理解 RNN
  2. elasticsearch 安装过程中可遇到的问题
  3. [BZOJ4320][ShangHai2006]Homework(根号分治+并查集)
  4. python递归必须要有_python如何递归生成树?
  5. idea 父文件_在ideal创建新的模块(子项目,同时依赖父模块)
  6. 5999元!OPPO Find X5 Pro 8+256GB版今日首销
  7. Android课程思维导图,Android实现思维导图
  8. java 泛型的类型擦除和桥方法
  9. 软件需求分析教程阅读笔记二
  10. 怎么用odbc连接mysql数据库连接_怎么用odbc连接mysql数据库
  11. kei4的安装教程(附下载地址)
  12. win11如何切换输入法 win11快速切换输入法
  13. Lab3: 自行车码表
  14. win10 通过命令打开画图工具
  15. Win32病毒入门 -- ring3篇
  16. Jquery常见的面试问题
  17. SEED-XDS560Plus Emulator for CCS3.3.82.exe 在硬盘上都安装了什么?
  18. 查询时报错The error may involve defaultParameterMap ### The error occurred while setting parameters
  19. 【毕业设计】基于Stm32的便携体测仪(心率 体温) - 单片机 嵌入式 物联网
  20. Linux学习日记4——ftp、lftp、nfs

热门文章

  1. Cisco packet tracer基本操作(快速入门了解这个软件)
  2. 顶尖文案app_topys顶尖文案app下载
  3. OpenCV实现按指定间隔抽取视频中的图像帧
  4. 大数据环境平台仓库日常跑批整理
  5. laravel —— 神奇的服务容器
  6. 悲剧了 花一千多买的三星的固态硬盘 突然无法访问了,用了这个命令好呆又能访问了
  7. Linux仿Ubuntu图标包,优秀的 Ubuntu 14.04 图标主题
  8. 软考A计划-试题模拟含答案解析-卷十
  9. windebug(转载别人的节选)
  10. oracle 编辑器 辅助,lua脚本编辑器下载执行oracle ddl