您的位置:首页 > 其它

lintcode---打劫房屋I 打劫房屋II

2017-12-31 20:56 447 查看

打劫房屋I

题目描述:

假设你是一个专业的窃贼,准备沿着一条街打劫房屋。每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警。

给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,你最多可以得到多少钱 在不触动报警装置的情况下。

样例:

给定 [3, 8, 4], 返回 8.

思路讲解:

我们首先分析一下如果我们打劫房屋是n,我们看一下他跟前面的哪几个有关系,由于两两不相邻,所以我们可以发现其与打劫前n-1间房屋以及打劫前n-2间房屋有关,然后我们发现其就是加不加上第n间房子的价值,不加上时,其就是打劫前n-1间房屋的价值,加上时,就是打劫前n-2间房屋的价值加上第n间房屋的价值,这样我们可以发现打劫n间房子就是打劫前n-1间房屋的价值与打劫前n-2间房屋的价值加上第n间房屋的价值的最大值。这样我们就得到了其动态转移方程sum_value
=max(sum_value[n-1],sum_value[n-2]+value
);

代码详解:

class Solution {
public:
/*
* @param A: An array of non-negative integers
* @return: The maximum amount of money you can rob tonight
*/
long long houseRobber(vector<int> &A) {
// write your code here
int length=A.size();

if(length==0)
return 0;

if(length==1)
return A[0];

if(length==2){
return A[0]>A[1]?A[0]:A[1];
}

long long *count=new long long[length];
count[0]=A[0];

//cout<<length<<endl;
count[1]=A[0]>A[1]?A[0]:A[1];

count[2]=A[1]>(A[0]+A[2])?A[1]:(A[0]+A[2]);

for(int i=3;i<length;i++)
{
count[i]=max(A[i]+count[i-2],count[i-1]);

}

return max(count[length-1],count[length-2]);
}
long long  max(long long  a,long long b)
{
if(a>b)
return a;
else
return b;
}
};


打劫房屋II

题目描述:

在上次打劫完一条街道之后,窃贼又发现了一个新的可以打劫的地方,但这次所有的房子围成了一个圈,这就意味着第一间房子和最后一间房子是挨着的。每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警。

给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,你最多可以得到多少钱 在不触动报警装置的情况下。

样例:

给出nums = [3,6,4], 返回 6, 你不能打劫3和4所在的房间,因为它们围成一个圈,是相邻的.

思路讲解:

由于所有的房子围成了一个圈,我们不能同时打劫第一家和最后一家,所以我们就把这个分成两种情况,第一种情况是打劫第一家,即从第一家打劫到倒数第二家,第二种情况是打劫最后一家,即从第二家打劫到最后一家。然后这两种情况就是我们上面运用到的第一种打劫房屋的算法,所以我们最后只需要判断上面两种情况打劫到的钱的最大值即是所求的能打劫到的最多的钱财。

代码详解:

class Solution {
public:
/*
* @param nums: An array of non-negative integers.
* @return: The maximum amount of money you can rob tonight
*/
int houseRobber2(vector<int> nums) {
// write your code here
int len=nums.size();
if(len==0||len==2){
return 0;
}else if(len==1){
return nums[0];
}else if(len==3){
return nums[1];
}else{
int value_i1=max(nums[1],nums[0]);//处理1-len-1的房屋
int value_i2=nums[0];

int value_ii1=max(nums[1],nums[2]);//处理2-len的房屋
int value_ii2=nums[1];
for(int i=2;i<len-1;i++){
int cur=max(value_i1,value_i2+nums[i]);
value_i2=value_i1;
value_i1=cur;

if(i!=2){
int now=max(value_ii1,value_ii2+nums[i]);
value_ii2=value_ii1;
value_ii1=now;
}
}
int res=max(value_ii1,value_ii2+nums[len-1]);

return max(res,value_i1);
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: