博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode 198 打家劫舍(动态规划)
阅读量:2434 次
发布时间:2019-05-10

本文共 1362 字,大约阅读时间需要 4 分钟。

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。
示例 1:
输入: [1,2,3,1]
输出: 4
解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。
示例 2:
输入: [2,7,9,3,1]
输出: 12
解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
偷窃到的最高金额 = 2 + 9 + 1 = 12 。
思考:
n个房屋,每个房间都有盗取/不盗取两种可能,类似求子集(暴力搜索)的方式,在不触发警报的情况下,选择总和最大的子集,最多有2^n种可能,时间复杂度为O(n)
贪心算法是否可行?
例如:在满足不触发警报的同时,每次选择财宝最多的房间
若考虑动态规划(dp)方法,如何确认dp原问题与子问题、状态、边界条件、状态转移方程?
由于同时从相邻的两个房屋中盗取财宝就会触发报警器,故:
a、若选择第i个房间盗取财宝,就一定不能选择第i-1个房间盗取财宝
b、若不选择第i个房间盗取财宝,则相当于只考虑前i-1个房间盗取财宝
算法思路:
1、确认原问题与子问题:
原问题为求n个房间的最优解,子问题为求前1个房间,前2个房间,……,前n个房间的最优解
2、确认状态:
第i个状态即为前i个房间能够获得的最大财宝
3、确认边界条件的值:
前1个房间的最优解,第1个房间的财宝
前2个房间的最优解,第1、2个房间的财宝
4、确定状态转移方程:
a、选择第i个房间:第i个房间 + 前i-2个房间的最优解
b、不选择第i个房间:前i-1个房间的最优解
动态规划转移方程:
dp[i] = max(dp[i-1], dp[i-2] + nums[i]);(i >= 3)

class Solution {
public: int rob(vector
& nums) {
if (nums.size() == 0){
return 0; } if (nums.size() == 1){
return nums[0]; } vector
dp(nums.size(), 0); //设第i个房间的最优解为dp[i] dp[0] = nums[0]; dp[1] = max(nums[0], nums[1]); for (int i = 2; i < nums.size(); i++){
dp[i] = max(dp[i-1], dp[i-2]+nums[i]); } return dp[nums.size()-1]; }};

转载地址:http://mvxmb.baihongyu.com/

你可能感兴趣的文章
移动周刊第 186 期:移动 App 客户端性能优化、iOS 开源库源码解析
查看>>
包学会之浅入浅出 Vue.js:开学篇
查看>>
JavaScriptCore 全面解析 (上篇)
查看>>
移动周刊第 187 期:App 模块化实战经验总结
查看>>
以不一样的视角看物联网协议
查看>>
JavaScriptCore全面解析 (下篇)
查看>>
嵌入式操作系统与物联网演进之路
查看>>
苹果公司揭秘首批列入 Swift 源代码兼容性开源项目清单
查看>>
Python 玩转物联网之 Micropython GPIO IRQ 处理
查看>>
移动周刊第 188 期:Android 安全性要点与规范核心详析
查看>>
手机为基础的 IoT 布局已经失效,下一代操作系统是什么模样?
查看>>
无线传感器网络使用指南
查看>>
Unity 脚本优化的那些坑
查看>>
《近匠》专访机智云 CTO 刘琰——从 0 到 1 开启智能化硬件开发
查看>>
深度对话微软,解读 HoloLens 技术设计细节
查看>>
移动周刊第 191 期:如何看待 Kotlin 成为 Android 官方支持开发语言?
查看>>
物联网浪潮之下,前端工程师如何迎刃而上?
查看>>
从端到云——工业物联网项目全栈快速开发
查看>>
LoRa vs NB-IOT:哪个物联网标准更具优势?
查看>>
有钱 Python,没钱 PHP,编程语言也嫌贫爱富
查看>>