标签:leetcode
House Robber && House RobberⅡ
House Robber
You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security system connected and it will automatically contact the police if two adjacent houses were broken into on the same night.
Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.
思路,定义一个数组dp,dp[i]表示从1到i个数的能偷的最大值,对于i+1,我们知道,前i+1个房子(从1开始)最大值为前i个房子dp值和偷第i+1个房子加上dp[i-1](需要绕开i个房子)两者的最大值,dp[i+1]=Max(dp[i],dp[i-1+nums[i]]),dp[0]=0,dp[1]=nums[1],
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.empty())
return 0;
int len=nums.size();
if(len==1)
return nums[0];
vector<int> dp(len+1,0);
dp[1]=nums[0];
for(int i=2;i<=len;i++)
{
dp[i]=Max(dp[i-1],nums[i-1]+dp[i-2]);
}
return dp[len];
}
int Max(int a,int b)
{
return a>b?a:b;
}
};
House RobbereⅡ
代码如下
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.empty())
return 0;
int len=nums.size();
if(len==1)
return nums[0];
return Max(rob(nums,0,len-1),rob(nums,1,len));
}
int rob(vector<int> &nums,int start,int end)
{
vector<int> dp(end+1,0);
dp[start+1]=nums[start];
dp[start]=0;
for(int i=start+2;i<=end;i++)
{
dp[i]=Max(dp[i-1],dp[i-2]+nums[i-1]);
}
return dp[end];
}
int Max(int a,int b)
{
return a>b?a:b;
}
};
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:leetcode
原文地址:http://blog.csdn.net/yujin753/article/details/48049995