初步动态规划讲解:数字三角形

初步,动态,规划,讲解,数字,三角形 · 浏览次数 : 4

小编点评

```c++ #include <iostream>#define N 1005using namespace std;int n, a[N][N];int main() { scanf(\"%d\", &n); for (int i = 1; i <= n; ++i) { for (int j = 1; j <= i; ++j) { scanf(\"%d\", &a[i][j]); } } for (int i = n - 1; i > 0; --i) { for (int j = 1; j <= i; ++j) { a[i][j] += max(a[i + 1][j], a[i + 1][j + 1]); } } printf("\n%d", a[1][1]); return 0;} 。 ```

正文

题目描述

观察下面的数字金字塔。

写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。

        7 
      3   8 
    8   1   0 
  2   7   4   4 
4   5   2   6   5 

在上面的样例中,从 7 → 3 → 8 → 7 → 5 7 \to 3 \to 8 \to 7 \to 5 73875 的路径产生了最大

输入格式

第一个行一个正整数 r r r ,表示行的数目。

后面每行为这个数字金字塔特定行包含的整数。

输出格式

单独的一行,包含那个可能得到的最大的和。

样例 #1

样例输入 #1

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

样例输出 #1

30

提示

【数据范围】
对于 100 % 100\% 100% 的数据, 1 ≤ r ≤ 1000 1\le r \le 1000 1r1000,所有输入在 [ 0 , 100 ] [0,100] [0,100] 范围内。

我们们以样例为例:把这个三角形化为一个类似于二叉树的形式,也就是这样:
在这里插入图片描述
对于这道题,我们有两种思路可以走:

  • 思路一:
    从根节点出发,每次找一个(叶)子节点最大的方向去走。
    得到的最终答案:7 + 8 + 1 + 7 + 5 = 28

  • 思路二:
    从叶子结点出发,每次找一个和最大的方向(也就是每一层父节点与(叶)子节点之和最大的一条路)去走。
    得到的最终答案:5 + 7 + 8 + 3 + 8 = 30

第一种算法是大家熟悉的贪心算法,第二种则是动态规划(Dynamic Programming)算法。

我们可以发现:明显贪心算法所得的不是最优解。

这里就会体现动态规划与贪心算法的区别:如果我们每次都只用贪心找一个最大的数,我们最后得到的只是一个局部较优解,并非是我们最后要求的答案(也就是全局最优解);而动态规划算法则是先把大的问题划分成了类似的小问题,通过小问题的最优解的合并得到大问题的最优解。

把整棵树推完之后根结点即是最优解。

最后给上代码:

#include <iostream>
#define N 1005
using namespace std;
int n, a[N][N];
int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= i; ++j) {
            scanf("%d", &a[i][j]);
        }
    }
    for (int i = n - 1; i > 0; --i) {
        for (int j = 1; j <= i; ++j) {
            a[i][j] += max(a[i + 1][j], a[i + 1][j + 1]);
        }
    }
    printf("%d", a[1][1]);
    return 0;
}

与初步动态规划讲解:数字三角形相似的内容:

初步动态规划讲解:数字三角形

题目描述 观察下面的数字金字塔。 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 在上面的样例中,从 7 → 3 → 8 → 7 → 5 7 \to 3 \to 8 \

Java算法之动态规划详解-买卖股票最佳时机

①动态规划 动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。20世纪50年代初,美国数学家贝尔曼(R.Bellman)等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理,从而创立了动态规划。动态规划的应用极其广泛,包括工程技术、经济、

frida动态插桩初探

前言 近期碰到了分析app的需求,就学习了一下 frida的动态插桩技术。frida是一款轻量级HOOK框架,可用于多平台上,例如android、windows、ios等。frida分为两部分,服务端运行在目标机上,通过注入进程的方式来实现劫持应用函数,另一部分运行在我们自己的控制机上。frida上

[转帖]初探Linux CPU动态调频与实测

https://zhuanlan.zhihu.com/p/33753019 关于 本文主要涉及Linux CPUFreq子系统是什么,为什么需要,怎么用。 并解决在实际测试中遇到的三个问题: scaling_governor没有userspace的问题。 /proc/cpuinfo与cpuinfo_

《最新出炉》系列初窥篇-Python+Playwright自动化测试-14-playwright操作iframe-番外篇

1.简介 通过前边三篇的学习,想必大家已经对iframe有了一定的认识和了解,今天这一篇主要是对iframe的一些特殊情况的介绍和讲解,主要从iframe的定位、监听事件和执行js脚本三个方面进行展开介绍。 2.iframe定位 2.1动态id属性如何定位 有时候,我们可能看到的iframe 的id

从零开始带你上手体验Sermant自定义插件开发

本文对Sermant的自定义插件开发的流程进行了体验和探索,包括项目编译、运行、动态配置验证、插件拦截原理等内容,希望对初次体验Sermant高效开发插件的开发者有所帮助。

[转帖]Oracle中INITRANS和MAXTRANS参数

每个块都有一个块首部。这个块首部中有一个事务表。事务表中会建立一些条目来描述哪些事务将块上的哪些行/元素锁定。这个事务表的初始大小由对象的INITRANS 设置指定。对于表,这个值默认为2(索引的INITRANS 也默认为2)。事务表会根据需要动态扩展,最大达到MAXTRANS 个条目(假设块上有足

大语言模型的应用探索—AI Agent初探!

前言 大语言模型的应用之一是与大语言模型进行聊天也就是一个ChatBot,这个应用已经很广泛了。 接下来的一个应用就是AI Agent。 AI Agent是人工智能代理(Artificial Intelligence Agent)的概念,它是一种能够感知环境、进行决策和执行动作的智能实体,通常基于机

初步搭建一个自己的对象存储服务---Minio

MinIO 是一个高性能的对象存储解决方案,类似于 Amazon S3,但它是开源的。MinIO 可以用于存储大规模的不结构化数据,比如照片、视频、备份和日志文件等。它设计为兼容 Amazon S3 API,因此可以很容易地与现有的使用 S3 的应用程序集成。

[转帖]初步探索GraalVM——云原生时代JVM黑科技

https://baijiahao.baidu.com/s?id=1749705890892955339&wfr=spider&for=pc 1 云原生时代Java语言的困境 经过多年的演进,Java语言的功能和性能都在不断的发展和提高,诸如即时编译器、垃圾回收器等系统都能体现Java语言的优秀,但