198. House Robber
来源:互联网 发布:prolink ii软件下载 编辑:程序博客网 时间:2024/06/08 19:08
一、题目简述
假设你是一位职业抢劫者,需要规划一条街的抢劫方法。每个房间都藏有一定数量的钱,抢劫的唯一约束是,相邻房间之间有安全系统连接,如果同晚相邻的房间被抢,安全系统将会自动报警。
给定一列非负整数表示每间房的钱数,计算在不触发安全系统的条件下,你能够抢到的最多钱数。
函数原型: int rob(vector<int>& nums)
二、编程思路
本题目编程思路较为明确,使用动态规划计算所能抢到的最多钱数,规划一是自己的思路,思路较为崎岖。规划二是网上题解,思路清晰明了。
本题实质就是求原始序列的一个子串,子串元素在原始序列中互不相邻,使子串之和最大。
动态规划一
动态规划最重要的是定义状态及状态转移方程,算法的优劣也在此体现。
令dp[i]表示在选择nums[i]的情况下,所能抢到的最大钱数。
则,
由于dp[i]表示已经抢了nums[i],故之前需要从dp[i-2]开始。
动态规划二
令dp[i]表示在之前i个房间中所能拿到最多的钱,i=nums.size()时,即所求。
则,
由此递推可知
即,抢前i个房间的最多钱数,等于,抢前i-1房间的最多钱数、抢前i-2个房间的最多钱数+第i个房间的钱数,的最大值。
三、程序设计
动态规划一
class Solution {public: int rob(vector<int>& nums) { int size=nums.size(); int *dp=new int[size+1]; memset(dp,0,sizeof(int)*(size+1)); int global_max=0; //global_max的作用:最优解不一定是抢nums[size-1]的情况。 for(int s=0;s<size;s++){ int max=nums[s]; int j=s-2; while(j>=0){ int tmp=dp[j]+nums[s]; if(tmp>max){ max=tmp; } j--; } dp[s]=max; if(max>global_max) global_max=max; } return global_max; }};
动态规划二
class Solution {public: int rob(vector<int>& nums) { int size=nums.size(); if(nums.size()==0) return 0; if(nums.size()==1) return nums[0]; vector<int> dp(nums.size()+1); dp[0]=0; dp[1]=nums[0]; for(int i=2;i<=nums.size();i++){ dp[i]=max(dp[i-1],(dp[i-2]+nums[i-1])); } return dp[nums.size()]; }};
四、实验心得
在动态规划中,状态的选取具有非常重要的作用。可以使用递推的方式观察状态之间转移规律,之后得出状态转移方程。
- 337. House Robber III+198. House Robber
- 198. House Robber&&213. House Robber II
- 198. House Robber && 213. House Robber II
- [LeetCode]198.House Robber
- 【LeetCode】198. House Robber
- 【LeetCode】198.House Robber
- LeetCode 198. House Robber
- 198.House Robber
- [leetcode] 198.House Robber
- [leetcode] 198. House Robber
- LeetCode:198. House Robber
- 198. House Robber LeetCode
- 198. House Robber
- [LeetCode]198. House Robber
- 198. House Robber
- LeetCode || 198. House Robber
- 198. House Robber
- LeetCode-198. House Robber
- NetworkStateView:界面多状态加载
- PCI Express非透明桥在多处理器系统中的应用
- 利用QT的QThread将一个类中的成员函数转到线程下执行
- CODE【VS】2809 盗窃-月之眼
- ajaxFileUpload :jQuery.handleError is not a function的解决方法
- 198. House Robber
- go语言学习总结1
- C++中的inline用法
- javaSE数据类型
- gradle 像maven一样自定义本地仓库地址
- python exec
- c# .accdb格式access数据库压缩
- leetcode题解-287. Find the Duplicate Number
- 自定义progressbar(类似dialog)