LeetCode 213:House Robber II

47 篇文章 0 订阅
class Solution {
public:
	int rob(vector<int>& nums) {
		int length = nums.size();
		//cout << "length = " << length << endl;
		int dp[10000] = {0};
		int max1 = 0;
		int max2 = 0;
		if (length == 0){
			return 0;
		}
		if (length == 1){
			return nums[0];
		}
		if (length == 2){
			return nums[0] >= nums[1] ? nums[0] : nums[1];
		}
		int count = 0;
		int max = 0;
		if (length == 3){
			while (count < 3){
				if (nums[count] >max){
					max = nums[count];
				}
				count++;
			}
			return max;
		}
		 
		 max = 0;
		dp[0] = nums[0];
		dp[1] = nums[0] >= nums[1] ? nums[0] : nums[1];
		for (int i = 2; i<length - 1; i++){
			//cout << "1:  i  = " << i << endl;
			max = 0;
			for (int j = 0; j < i - 1; j++){
			//	cout << "1:  j  = " << j << endl;
				if (dp[j] >= max){
					max = dp[j];
				//	cout << "1:  max  = " << max << endl;
				}
			}
			cout << "###   1:  max  = " << max << endl;
			dp[i] = max + nums[i];
			//int max1 = dp[i];
			if (dp[i] >max1){
				max1 = dp[i];
			}
			//cout << "dp[i] = " << dp[i] << " 1: i = " << i << endl;
		}
		max = 0;
		int fp[1000] = {0};
		fp[1] = nums[1];
		fp[2] = nums[2];
		for (int i = 3; i < length; i++){
			//cout << "2:  i  = " << i << endl;
			for (int j = 1; j < i - 1; j++){
			//	cout << "2: j = " << j << endl;
				if (fp[j] >= max){
					max = fp[j];
			//		cout << "2: max= " << max << endl;
				}
			}
			fp[i] = max + nums[i];
			//cout << "fp[i] = " << fp[i] << " 1: i = " << i << endl;
			
			if (fp[i]>max2){
				max2 = fp[i];

			}
		}
		if (max2 >= max1){
			return max2;
		}
		else{
			return max1;
		}
	}
};

这道题不要想的太复杂就是针对第一种情况的两种情况分类讨论,对于边界的处理要比第一种rober多了一个长度为三的处理,分成2到n-1,3到n两种情况处理

点击打开链接动态规划题目列表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值