HouseRobber(即求一串數中不連續的數之和中最大的)

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.

Solutions:

1)

應用動態規劃思想,r[i]=max { r[i-1], r[i-2]+num[i] }

錯誤做法:

class Solution {
public:	
	int max(int a, int b) {
		return a>b?a:b;
	}
    int rob(vector<int>& nums) {
		int maxsum=0;
		if(nums.empty()){
			return maxsum;
		}
		if(nums.size()==1) {
			return nums[0];
		}
		if(nums.size() == 2) {
			return max(nums[0], nums[1]);
		}
		vector<int> r;
		r.push_back(nums[0]);
		r.push_back(nums[1]);
		for(int i=2; i< nums.size(); ++i) {
			int m=0;
			m=max(r[i-1], r[i-2]+nums[i]);
			r.push_back(m);
		}
		return r.back();
    }
};

對於[2,1,1,2]會得到3,應爲4. 錯誤在於對r[1]的處理。

 class Solution {
public:	
	int max(int a, int b) {
		return a>b?a:b;
	}
    int rob(vector<int>& nums) {
		int maxsum=0;
		if(nums.empty()){
			return maxsum;
		}		
		vector<int> r;
		r.push_back(nums[0]);		
		for(int i=1; i< nums.size(); ++i) {
			int m=0;
			if(i == 1) {
				m=max(nums[0], nums[1]);
			}
			else {
				m=max(r[i-1], r[i-2]+nums[i]);
			}			
			r.push_back(m);
		}
		return r.back();
    }
};

2)還可以分別記錄到偶數和奇數位時的最值。

class Solution {
public:
	int rob(vector<int> &nums) {
		int odd=0, even=0;
		if(nums.size()==0) {
			return 0;
		}
		even = nums[0];
		for(int i=1; i<nums.size(); ++i) {
			if(i & 0x1) {
				odd=max(even, odd+nums[i]);
			}
			else {
				even=max(odd, even+nums[i]);
			}
		}
		return max(even, odd);
	}	
};

3)也是動態規劃。和上邊的算法基本一致。

      用A[0]表示沒有rob當前house的最大money,A[1]表示rob了當前house的最大money,那麼A[0] 等於rob或者沒有rob上一次house的最大值。即A[i+1][0] = max(A[i][0], A[i][1])..  那麼rob當前的house,只能等於上次沒有rob的+money[i+1], 則A[i+1][1] = A[i][0]+money[i+1]。

只需要兩個變量保存結果就可以了。

class Solution {
public:
    int rob(vector<int> &num) {
        int best0 = 0;   // 表示沒有選擇當前house
        int best1 = 0;   // 表示選擇了當前house
        for(int i = 0; i < num.size(); i++){
            int temp = best0;
            best0 = max(best0, best1); // 沒有選擇當前house,那麼它等於上次選擇了或沒選擇的最大值
            best1 = temp + num[i]; // 選擇了當前house,值只能等於上次沒選擇的+當前house的money
        }
        return max(best0, best1);
    }
};




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章