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.肖像 ...
最新文章
- 多家巨头实测鸿蒙系统:比安卓快60%
- 网站推广期间要学会筛选关键词,有利于提升网站推广转化率
- 由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值 解决方案...
- 笔记-项目采购管理-合同类型-成本加激励费用合同
- boost::log::sinks::text_ostream_backend用法的测试程序
- mysql编码丢了_记住:永远不要在 MySQL 中使用 UTF-8
- KVM虚拟化基础概念
- python中元组和列表的区别_Python 序列:列表、元组
- 一个完整的物联网项目管理流程
- seaborn无法下载数据的问题
- 开关电源损耗分析 以Buck为例
- java进程通信方式
- python实现手写字识别_pytorch实现MNIST手写体识别
- 换个角度感受华为云的GPU云服务器
- int temp java,temp是什么意思
- word无法加载mathtype.wll
- 古时候有个【百僧问题】,一百馒头一百僧,大僧三个更无争,小僧三人分一个,大小和尚各几丁? *...
- 最后一天购书优惠!好书必买,不容错过!
- 职场饭桌:酒桌上的规矩,与领导吃饭如何谈话
- 26.什么是梯度爆炸
热门文章
- java 编码app_智慧职教mooc的APPJava编码技术(四川交通职业技术学院)答案搜题公众号...
- 揭秘可变剪切研究的本质
- 自媒体都有什么平台,哪些平台好?
- 小学计算机上课课前导入视频教程,小学信息技术教学中微视频的导入实践分析...
- 豆瓣评分9.4!跟邱锡鹏教授一起学「神经网络与深度学习」,7月19日开课
- IEduChina2019国际学校展暨国际教育论坛温暖深圳
- 根据接口获取得数据,布局两列多行的代码写法
- prometheus定义counter指标
- 公司银企对账怎么操作
- 前端面试题总结(js、html、小程序、React、ES6、Vue、算法、全栈热门视频资源)持续更新