LeetCode——动态规划

198 House Rober
方法一)自顶向下的递归

class Solution {
private:
	//记录    memo[i]表示——抢劫[i....nums.size()-1]所能获取的最大收益
	vector<int> memo;
	//考虑去抢劫[index....nums.size()-1]这个范围内所有的房子,返回值——抢劫[index....nums.size()-1]所能获取的最大收益
	int tryRob(vector<int> &nums, int index)
	{
		if (index >= nums.size())
			return 0;
		if (memo[index] != -1)
			return memo[index];
		int res = 0;
		for (int i = index; i < nums.size(); i++)
		{
			res=max(res,nums[i] + tryRob(nums, i + 2));
			
		}
		memo[index] = res;
		return res;
	}

public:
	int rob(vector<int>& nums) {
		memo = vector<int>(nums.size(), -1);

		return tryRob(nums, 0);
	}
};

方法二)用自底向上的动态规划

int rob(vector<int>& nums) {
		int n = nums.size();
		if (n == 0)
			return 0;

		// memo[i]表示——抢劫[i....n-1]所能获取的最大收益
		vector<int> memo(n, -1);
		memo[n - 1] = nums[n - 1];
		for (int i = n - 2; i >= 0; i--)
		{
			for (int j = i; j < n; j++)
				memo[i] = max(memo[i], nums[j] +(j+2<n? memo[j + 2]:0));
		}
		return memo[0];
	}

213 .  House Robber
这道题是前一道题的升级版

假设最后一个房间和第一个房间也是邻居


class Solution {
private:
	
public:
	int rob(vector<int>& nums) {
		int n = nums.size();
		if (n == 0)
			return 0;
		if (n == 1)
			return nums[0];
		if (n == 2)
			return max(nums[0], nums[1]);

		// memo[i]表示——抢劫[i....n-1]所能获取的最大收益
		//抢劫[1......n-1]
		vector<int> memo(n, -1);
		memo[n - 1] = nums[n - 1];
		for (int i = n - 2; i >= 1; i--)
		{
			for (int j = i; j < n; j++)
				memo[i] = max(memo[i], nums[j] +(j+2<n? memo[j + 2]:0));
		}
		//抢劫[0......n-2]
		vector<int> memo1(n, -1);
		memo1[n - 2] = nums[n - 2];
		for (int i = n - 3; i >= 0; i--)
		{
			for (int j = i; j < n-1; j++)
				memo1[i] = max(memo1[i], nums[j] + (j + 2<n-1 ? memo1[j + 2] : 0));
		}
		for (int i = 0; i < memo1.size(); i++)
			cout << memo1[i] << " ";
		cout << endl;
		cout << memo[1] << " " << memo1[0] << endl;
		return max(memo[1],memo1[0]);
	}
};

猜你喜欢

转载自blog.csdn.net/eereere/article/details/80328690