1258:【例9.2】数字金字塔

时间限制: 1000 ms         内存限制: 65536 KB

提交数: 9635     通过数: 5467

【题目描述】

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

在上面的样例中,从13到8到26到15到24的路径产生了最大的和86。

【输入】

第一个行包含R(1≤ R≤1000),表示行的数目。

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

所有的被供应的整数是非负的且不大于100。

【输出】

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

【输入样例】

5

13

11 8

12 7 26

6 14 15 8

12 7 13 24 11

【输出样例】

86

【动态规划基础】数字金字塔

经典的动态规划水题

方法一:贪心

题目里说了,从上往下走,要求出路径的最大值,那么我最先想到的方法就是——

你每次都走最大的一边就可以了啊。

就像这样:

但是,如果你是一个善于造数据来验证你的算法的人,你很快就会发现自己算法的问题,就像这样:

1

2 1

1 2 9

1 2 8 9

3 3 2 9 9

在这一组数据中,如果使用贪心算法,就会一开始就左边,从而错失下面全是9的右边。

也就是说,贪心算法看得太近了,没有顾全大局。

方法二:搜索 & 记忆化搜索

像我这样的暴力型选手,碰见什么题都要用搜索写一遍。可以对拍不说,写不出来的时候,还可以骗分。

#include

using namespacestd;int jzt[1005][1005], maxn, summ, n;void dfs(int i, intj){if(i==n){

maxn=maxn>summ?maxn:summ;

}else{

summ+=jzt[i+1][j];

dfs(i+1, j);

summ-=jzt[i+1][j];

summ+=jzt[i+1][j+1];

dfs(i+1, j+1);

summ-=jzt[i+1][j+1];

}

}intmain(){

scanf("%d", &n);for(int i=0; i

scanf("%d", &jzt[i][j]);

}

}

dfs(0, 0);

printf("%d", maxn+jzt[0][0]);return 0;

}

T了。。

但是没关系,我们还有搜索优化利器:记忆化。

通过观察与推理,我们会发现,中间的这些点到底端的最优解会被重复计算,所以我们要把这些状态记忆下来,四舍五入约等于全部记下来(其实是我懒得做特判)。。

#include

using namespacestd;int n, bz[1005][1005], jzt[1005][1005];int dfs(int x, inty){if(x==n-1) returnjzt[x][y];else{if(bz[x][y]) returnjzt[x][y];else{

bz[x][y]=1;

jzt[x][y]+=max(dfs(x+1, y), dfs(x+1, y+1));returnjzt[x][y];

}

}

}intmain(){

scanf("%d", &n);for(int i=0; i

scanf("%d", &jzt[i][j]);

}

}

printf("%d", dfs(0, 0));return 0;

}

这次,就成功地AC了,不得不感叹记忆化的强大。其实记忆化搜索的用时就已经相当于动态规划了(这也是为什么我把搜索学好后才学动态规划)。。

方法三:动态规划(递推)

现在,想象一下,通过某些神奇的算法,你已经成功走到了倒数第二行的某一个位置,那么下一步应该怎么走呢?

很明显,只要走最大的那个就可以了。因为这里只有最后一步了,局部最优解就等于全局最优解。

但事实是,你并不知道这个神奇的算法。。。所以你还是不知道你会走到倒数第二行的哪个位置。

但是,无论如何,你最终都会走到倒数第二行的n-1个点之一。那么我们就把到任意一个点的全局最优解求出来吧。

那么知道了倒数第二行怎么走,那么我们就再进一步吧。

通过某些神奇的算法,你已经成功走到了 n-2 行(倒数第三行)的某一个位置,那么下一步应该怎么走呢?

这时,我们就不能通过单纯的比大小来决定了。

但是,我们通过上一步的计算,已经知道了走到 n-1 行的最优解,而且,我们也可以算出来走到 n-1 行某一个位置之后走到的点的和(这里指之前算出的最优解)。

那么问题就很简单了,只需要走这个值最大的一边就可以了。

重复这个过程。。。

最后:

通过某些神奇的算法,你已经成功走到了第 1 行的某一个位置,那么下一步应该怎么走呢?

显然,我们已经知道了下一步该怎么走,,而且这时,我们就可以考虑这个“神奇的算法”了。

由于第一行只有一个数,所以我们可以肯定的是,我们走到的一定是这个位置。

最后,再算出第一步该怎么走时,你就算出了这个最优路径。

代码:

#include

using namespacestd;int n, a[1005][1005];intmain(){

cin>>n;for(int i=0; i

cin>>a[i][j];

}

}for(int i=n-2; i>=0; i--){for(int j=0; j<=i; j++){

a[i][j]+= max(a[i+1][j], a[i+1][j+1]);

}

}

cout<< a[0][0];return 0;

}

Java动态规划走金字塔_【动态规划基础】数字金字塔相关推荐

  1. 动态规划走楼梯_动态规划问题为什么要画表格?

    ❝ 本文是我的 91 算法第一期的部分讲义内容.91 算法第一期已经接近尾声,二期的具体时间关注我的公众号即可,一旦开放,会第一时间在公众号<力扣加加>通知大家. ❞ 动态规划可以理解为是 ...

  2. java中override快捷键_【基础回溯1】面试又被 Java 基础难住了?推荐你看看这篇文章。...

    本文已经收录自 https://github.com/Snailclimb/JavaGuide  (59k+ Star):[Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识. ...

  3. 本题要求实现函数输出n行数字金字塔。_练习5-3 数字金字塔 (15分)

    本题要求实现函数输出n行数字金字塔. 函数接口定义: void pyramid( int n ); 其中n是用户传入的参数,为[1, 9]的正整数.要求函数按照如样例所示的格式打印出n行数字金字塔.注 ...

  4. java 爬楼梯算法_动态规划-爬楼梯问题java实现

    最近开始看算法导论,研究了一下动态规划,下面就开始直入主题开始记录近期看的第一个知识点动态规划.提起动态规划就不得不提几个动态规划的金典问题爬楼梯.国王金矿.背包问题.今天就仔细分析一下爬楼梯问题. ...

  5. java动态规划货车运输_动态规划01背包问题_动态规划方法在配送线路优化中的应用研究...

    [摘要] 应用图论的方法对配送线路进行优化的缺点是,当线路复杂时计算较为烦琐,而应用动态规划的方法能有效解决这个问题.本文从理论上应用动态规划的方法对共同配送线路进行优化,并应用此方法对实际问题进行计 ...

  6. java 动态规划找零钱_动态规划之找零钱问题

    找零钱是一个经典的动态规划问题.这种问题,我建议,首先学会暴力解法,然后从暴力解法中优化出动态规划的解法,这样,更能体会动态规划的魅力. 问题描述 有n种不同币值的硬币,硬币数量无限.给定一个数量T, ...

  7. java经典问题国王_动态规划-国王的金矿问题java

    紧接着上一篇动态规划问题,现在我们开始探讨一个新的问题,问:有一个发现了5个金矿,每一个金矿的储量不同,需要参与挖掘的工人数也不通,参与挖矿工人的总数量是10人,每一座金矿要么全挖,要么不挖,不能派一 ...

  8. java动态规划鸡蛋问题_动态规划——楼层扔鸡蛋问题

    前言 大一的时候蓝桥杯省赛遇到过(作为非编程题的压轴题),这次看的别人的面经也多次出现,就写篇博文总结一下. 题目 有一栋楼共100层,一个鸡蛋从第N层及以上的楼层落下来会摔破, 在第N层以下的楼层落 ...

  9. java动态规划鸡蛋问题_动态规划系列/高楼扔鸡蛋问题.md · lipengfei/fucking-algorithm - Gitee.com...

    # 经典动态规划问题:高楼扔鸡蛋 今天要聊一个很经典的算法问题,若干层楼,若干个鸡蛋,让你算出最少的尝试次数,找到鸡蛋恰好摔不碎的那层楼.国内大厂以及谷歌脸书面试都经常考察这道题,只不过他们觉得扔鸡蛋 ...

  10. 动态规划走楼梯_负重爬楼梯、过草地,服贸会六足机械人展示“送水到家”

    新京报快讯(记者 张璐)2020年服贸会开幕在即,奥园玲珑塔下,一个高大的机器人"指出了"机器人专题展的具体位置.记者提前探营看到,专题展多足机器人场地设置了草地.台阶.拱桥.斜坡 ...

最新文章

  1. CV07-DeepLab v3+笔记
  2. Docker 数据卷之进阶篇
  3. 网络工程师_记录的一些真题_2014上半年上午
  4. python 代码转成 c_如何将此C代码转换为Python?
  5. 记住,永远不要在MySQL中使用“utf8”
  6. 概率整形 Peobabilistic Shaping PS
  7. Python EFZ文件 气象_python的日常应用-gt;入门篇01
  8. daemon守护进程初识
  9. 软件设计师中级考试经验总结
  10. C# winFrom 自定义gridview样式制作好看的大屏显示队列
  11. Java调用webservice
  12. 重绘回流个人理解版本
  13. 获取网页视频,日常下载工具推荐——XDM
  14. 如果我们能正预基面因子
  15. 影评:雨天的水彩画 《爱有天意》观感(转)
  16. 计算机专业的英文简历范文带翻译,计算机软件专业英文简历范文 英文简历范文带翻译...
  17. 太离谱了!一行Python代码写的游戏,我能这样玩一天!
  18. hiredis——Redis的C++库(使用教程
  19. 测试4年裸辞失业,面试17k的测试岗被按在地上摩擦,结局让我崩溃大哭...
  20. VR用到教育上了?90后怎么就没有赶上呢!

热门文章

  1. Django(三) ORM 数据库操作
  2. LeetCode Closest Binary Search Tree Value II
  3. (转)Oracle中通过位图索引提高查询效率
  4. 《Java 学习笔记》 第剩余章节阅读体验附书评。
  5. abaqus dat文件 matlab_提升Abaqus求解效率的七种武器
  6. android listview 滑动条显示_ListView详细介绍与使用
  7. python随机读取字符_Python random模块(获取随机数)常用方法和使用例子
  8. 如何在 Linux 中使用 AppImage
  9. blender国内下载
  10. C++中for循环的5种语法