OJ刷题------打家劫舍(C++完整代码)

**

一、题目

**
在这里插入图片描述
输入:1 2 3 1
输出:4

二、分析

分析参考链接:参考思考链接
当前房屋偷与不偷取决于 前一个房屋和前两个房屋是否被偷了。
在这里插入图片描述
比如,输入的数组:1 2 3 1
①从前往后思考数组的元素 —偷还是不偷,第一个元素(是1),假设偷了,偷得的资产就是1;
②思考第二个元素偷不偷—
如果偷第二个元素(2),那第一个元素(1)就不能偷了,2>1,所以,考虑前2个元素的话,偷第二个元素不偷第一个元素。
③思考第三个元素偷不偷—
如果偷第三个元素(3),那就不能偷第二个元素(2),可以偷第一个元素(1),那么偷得的资产就是1+3=4;然而,如果不偷第三个元素(3),即偷了第二个元素(2),那资产只是2; 4>2, 所以,考虑前3个元素的话,偷第一个和第三元素,不偷第二个元素。
④思考第四个元素偷不偷—
如果偷第四个元素(1),那就不能偷第一和第三个元素,只能偷第四和第二个元素,即1+2=3;如果不偷第四个元素(1),那就可以偷第三和第一个元素,即1+3=4;所以,考虑前4个元素的话,偷第一个和第三元素,不偷第二和第四个元素。

所以,综上,偷第一个和第三元素,偷得的资产是4。

三、代码

#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
	int rob(vector<int>& nums)
	{
		if (nums.size() == 0) return 0;
		if (nums.size() == 1) return nums[0];
		vector<int> dp(nums.size());
		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];
	}
};
int main()
{
	Solution sol;
	vector<int> nums;
	int i;
	while (cin >> i)
	{
		nums.push_back(i);
		if (cin.get() == '\n') break;
	}
	cout << sol.rob(nums)<<endl;
	return 0;
}

结果
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值