Java动态规划走金字塔_【动态规划基础】数字金字塔
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动态规划走金字塔_【动态规划基础】数字金字塔相关推荐
- 动态规划走楼梯_动态规划问题为什么要画表格?
❝ 本文是我的 91 算法第一期的部分讲义内容.91 算法第一期已经接近尾声,二期的具体时间关注我的公众号即可,一旦开放,会第一时间在公众号<力扣加加>通知大家. ❞ 动态规划可以理解为是 ...
- java中override快捷键_【基础回溯1】面试又被 Java 基础难住了?推荐你看看这篇文章。...
本文已经收录自 https://github.com/Snailclimb/JavaGuide (59k+ Star):[Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识. ...
- 本题要求实现函数输出n行数字金字塔。_练习5-3 数字金字塔 (15分)
本题要求实现函数输出n行数字金字塔. 函数接口定义: void pyramid( int n ); 其中n是用户传入的参数,为[1, 9]的正整数.要求函数按照如样例所示的格式打印出n行数字金字塔.注 ...
- java 爬楼梯算法_动态规划-爬楼梯问题java实现
最近开始看算法导论,研究了一下动态规划,下面就开始直入主题开始记录近期看的第一个知识点动态规划.提起动态规划就不得不提几个动态规划的金典问题爬楼梯.国王金矿.背包问题.今天就仔细分析一下爬楼梯问题. ...
- java动态规划货车运输_动态规划01背包问题_动态规划方法在配送线路优化中的应用研究...
[摘要] 应用图论的方法对配送线路进行优化的缺点是,当线路复杂时计算较为烦琐,而应用动态规划的方法能有效解决这个问题.本文从理论上应用动态规划的方法对共同配送线路进行优化,并应用此方法对实际问题进行计 ...
- java 动态规划找零钱_动态规划之找零钱问题
找零钱是一个经典的动态规划问题.这种问题,我建议,首先学会暴力解法,然后从暴力解法中优化出动态规划的解法,这样,更能体会动态规划的魅力. 问题描述 有n种不同币值的硬币,硬币数量无限.给定一个数量T, ...
- java经典问题国王_动态规划-国王的金矿问题java
紧接着上一篇动态规划问题,现在我们开始探讨一个新的问题,问:有一个发现了5个金矿,每一个金矿的储量不同,需要参与挖掘的工人数也不通,参与挖矿工人的总数量是10人,每一座金矿要么全挖,要么不挖,不能派一 ...
- java动态规划鸡蛋问题_动态规划——楼层扔鸡蛋问题
前言 大一的时候蓝桥杯省赛遇到过(作为非编程题的压轴题),这次看的别人的面经也多次出现,就写篇博文总结一下. 题目 有一栋楼共100层,一个鸡蛋从第N层及以上的楼层落下来会摔破, 在第N层以下的楼层落 ...
- java动态规划鸡蛋问题_动态规划系列/高楼扔鸡蛋问题.md · lipengfei/fucking-algorithm - Gitee.com...
# 经典动态规划问题:高楼扔鸡蛋 今天要聊一个很经典的算法问题,若干层楼,若干个鸡蛋,让你算出最少的尝试次数,找到鸡蛋恰好摔不碎的那层楼.国内大厂以及谷歌脸书面试都经常考察这道题,只不过他们觉得扔鸡蛋 ...
- 动态规划走楼梯_负重爬楼梯、过草地,服贸会六足机械人展示“送水到家”
新京报快讯(记者 张璐)2020年服贸会开幕在即,奥园玲珑塔下,一个高大的机器人"指出了"机器人专题展的具体位置.记者提前探营看到,专题展多足机器人场地设置了草地.台阶.拱桥.斜坡 ...
最新文章
- CV07-DeepLab v3+笔记
- Docker 数据卷之进阶篇
- 网络工程师_记录的一些真题_2014上半年上午
- python 代码转成 c_如何将此C代码转换为Python?
- 记住,永远不要在MySQL中使用“utf8”
- 概率整形 Peobabilistic Shaping PS
- Python EFZ文件 气象_python的日常应用-gt;入门篇01
- daemon守护进程初识
- 软件设计师中级考试经验总结
- C# winFrom 自定义gridview样式制作好看的大屏显示队列
- Java调用webservice
- 重绘回流个人理解版本
- 获取网页视频,日常下载工具推荐——XDM
- 如果我们能正预基面因子
- 影评:雨天的水彩画 《爱有天意》观感(转)
- 计算机专业的英文简历范文带翻译,计算机软件专业英文简历范文 英文简历范文带翻译...
- 太离谱了!一行Python代码写的游戏,我能这样玩一天!
- hiredis——Redis的C++库(使用教程
- 测试4年裸辞失业,面试17k的测试岗被按在地上摩擦,结局让我崩溃大哭...
- VR用到教育上了?90后怎么就没有赶上呢!
热门文章
- Django(三) ORM 数据库操作
- LeetCode Closest Binary Search Tree Value II
- (转)Oracle中通过位图索引提高查询效率
- 《Java 学习笔记》 第剩余章节阅读体验附书评。
- abaqus dat文件 matlab_提升Abaqus求解效率的七种武器
- android listview 滑动条显示_ListView详细介绍与使用
- python随机读取字符_Python random模块(获取随机数)常用方法和使用例子
- 如何在 Linux 中使用 AppImage
- blender国内下载
- C++中for循环的5种语法