C++每日一练:打家劫室(详解动态规划法)
文章目录
- 前言
- 一、题目
- 二、分析
- 三、代码
- 总结
前言
这题目出得很有意思哈,打劫也是很有技术含量滴!不会点算法打劫这么粗暴的工作都干不好。
提示:以下是本篇文章正文内容,下面案例可供参考
一、题目
题目名称:
打家劫舍
题目描述:
一个小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
输入描述:
输入一个正整数n代表房屋的数量(n≤100),接着输入n个非负整数代表每间房屋的现金数量
输出描述:
小偷能偷取的最大金额。
示例1
输入
4
1 2 3 1
输出
4
二、分析
我们假设只有三个房间,事情就很简单了。做为专业小偷,我们知道,房屋编号是从0开始的,只能偷1号房屋或0号+2号房屋。为了取得最大战果,我们分别去看了看每个房屋能偷到多少。出门比较一下,就知道结果了。
我们逛完了三个房屋,现在站在第2号房屋门口来思考一下,就是选择0和2,或选1的问题。
我们把0+2能偷到的钱先记在2号房屋门上,把1号能偷到的钱记在1号门上,然后去看看3号房屋有多少钱可偷。这样1、2、3号房屋又成了一个同样的选择…
我们不停的在门上记录能偷到的钱,不停的用同样的方法选择。
拿示例来说,我们在1号房屋门上记上2毛,2号房屋门上记上4毛(0号加2号),然后和3号房屋来比较,显然4毛大于1号的2毛加3号的1毛。侦察完成,就偷0号加2号了!
再找个长点的例子:
1 2 3 2 9 1 2
同样先在1号房屋门上记上2毛,2号房屋门上记4毛(0号+2号),侦察完3号房屋后,就成了:
2 4 2 9 1 2
继续侦察下一家:
4 4 9 1 2
4 (13) 1 2
(13) 5 2
5 (15)
(15)
最后偷得15毛!
三、代码
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>using namespace std;int solution(int n, std::vector<int>& vec){int result=0;// TODO:vector<int> tmp={vec[0], max(vec[0], vec[1])};if(n==1) return tmp[0];if(n==2) return tmp[1];for (int i=2; i<n; ++i){tmp[i] = max(tmp[i-1], tmp[i-2]+vec[i]);}result = tmp[n-1];return result;
}int main() {int n;std::vector<int> vec;std::cin>>n;std::string line_0, token_0;getline(std::cin >> std::ws,line_0);std::stringstream tokens_0(line_0);while(std::getline(tokens_0, token_0, ' ')){vec.push_back(std::stoi(token_0));}int result = solution(n,vec);std::cout<<result<<std::endl;return 0;
max(vec[0], vec[1])
这一句解决了前二个房屋的选择,因为第二个房屋我们必须选前两个中最大的。如果0号是最大的,就把1号变成0号一样,再来继续选择。
举例来看:
7 1 1 2
侦察前二个房屋后就是:
7 7 1 2
然后7 8 2
最后9
如果是这样的:
1 7 2 1
侦察前二个后就还是:
1 7 2 1
所以初始化的时候一定要考虑清楚!
总结
所谓动态规划:就是将问题划分为一系列子问题,求各子问题的最优解,然后以自底向上的方式递归地从子问题的最优解构造出整个问题的最优解。
在本例中,我们把n个房屋不停的当作三个房屋来处理。所以我们设计了一个tmp数组来存储过程数据。
动态规划和分治法有点像,都是把复杂问题分解成简单的小问题。
不过动态规划的子问题之间不是独立的,子问题的解往往会在下一个选择中被使用。
而分治法,一般会把一个复杂的问题分解成若干个独立的子问题,求解子问题后再合成本问题的解。今天的 “小艺照镜子” (本专栏的另一篇文章有详解)就是用分治法解的。
C++每日一练:打家劫室(详解动态规划法)相关推荐
- Leetcode_6_Dynamic Programming_198,213打家劫室,打家劫室II
自己写滴~ 198.打家劫室 class Solution {public int rob(int[] nums) {if(nums.length==0) return 0; int[] dp=new ...
- [转自脚本之家] Javascript cookie 详解
cookie概述 在上一节,曾经利用一个不变的框架来存储购物栏数据,而商品显示页面是不断变化的,尽管这样能达到一个模拟 全局变量的功能,但并不严谨.例如在导航框架页面内右击,单击快捷菜单中的[刷新]命 ...
- yii2通过url访问类中的方法_每日学点---nginx变量使用方法详解(3)
也有一些内建变量是支持改写的,其中一个例子是 $args. 这个变量在读取时返回当前请求的 URL 参数串(即请求 URL 中问号后面的部分,如果有的话 ),而在赋值时可以直接修改参数串.我们来看一个 ...
- [每日电路图] 5、心率检测电路设计详解——送给想了解心率计的小白(博主推荐)...
Why I Write This Artical? 现在基本上到处都有心率检测的影子,然而淘宝上找个相应的心率检测的模块却是又少又贵! 本人不服,遂打算自己做一个心率检测模块! 一.心率小常识:(18 ...
- 值得收藏的30道Python练手题(附详解)
今天给大家分享30道Python练习题,建议大家先独立思考一下解题思路,再查看答案. 1. 已知一个字符串为 "hello_world_yoyo",如何得到一个队列 [" ...
- Android Studio 插件开发详解一:入门练手
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78112003 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...
- java xml转map_java练习本(原每日一练)(20190514)
名人名言 昨日翻译 "The No. 1 reason people fail in life is because they listen to their friends, family ...
- 2022年二级建造师建设工程法规及相关知识考试每日一练及答案
题库来源:优题宝公众号 2022年二级建造师建设工程法规及相关知识考试每日一练及答案,由优题宝公众号根据最新二级建造师建设工程法规及相关知识考试大纲与历年二级建造师建设工程法规及相关知识考试真题汇总编 ...
- 2012届高三语文每日一练
2012届高三语文每日一练 2012年01月15日 [b]高三语文[/b][b]第[/b][b]4[/b][b]练 [/b] 1.下列词语中,字形和加点字的读音全都正确的一项是(3分)( ) A.肖像 ...
最新文章
- 如何兼容並蓄Android Studio 與 Eclipse 的優點, 減少顧此失彼的缺憾
- JAVA学习笔记--初始化与清理
- barbuttonitem 文字换行_IOS TableView的Cell高度自适应,UILabel自动换行适应
- Yarn的默认端口(转载)
- c#中使用openssl
- 这一天,我用 Rust 重写了已有 19 年历史的 C++ 库!
- easyUI替换非16x16的图标
- 针式打印机打印发虚_针式打印机使用技巧
- 计算机维修工程师认证,计算机维修工程师认证模拟试题.doc
- 心理学是怎样产生的?
- Gateway—网关服务
- 心灵震撼《一个8岁女孩的遗书》
- C++各种经典小游戏
- Meth | 新建git项目
- 百度网盘无法下载怎么办?
- ros笔记 URDF仿真 3.joint
- 微信第 1 行代码曝光,还有多少个十年!
- s5pv210 linux内核移植,S5PV210-kernel-从三星官方的内核开始移植
- 租用云服务器之前 这些坑你得擦亮眼睛
- 2020熔化焊接与热切割模拟考试及熔化焊接与热切割作业模拟考试
热门文章
- 2021年最详细的Android屏幕适配方案汇总
- 大数据分析案例-基于逻辑回归算法构建垃圾邮件分类器模型
- try catch 用法
- Xshell7工具下载安装以及简单使用
- 用伪类添加翘边阴影::before和::after
- ikbc 104键win键失效
- lower_bound( )和upper_bound( )的常见用法
- 1130. 【NOIP2005PJ】循环
- 男孩子学医好还是学计算机好,男孩子学医选什么专业好 最有前景的医学类专业...
- Spelling Error Correction with Soft-Masked BERT