(动态规划基础 打家劫舍)leetcode 198

已知h2和h1,用已知推出未知

推是求答案,回溯是给答案
这里图片给出dfs暴力,再进行记录答案完成记忆化搜索,再转为dp数组
(动态规划基础 打家劫舍)leetcode 198_第1张图片


(动态规划基础 打家劫舍)leetcode 198_第2张图片(动态规划基础 打家劫舍)leetcode 198_第3张图片

#include
#include
#include
//nums:2,1,1,2
//dp:2,2,3,4
using namespace std;
//dp[i]=max(nums[i]+dp[i-2],dp[i-1]);
//nums[i]+dp[i-2]抢这家店
//dp[i-1]不抢这家店



//dfs 暴力+记忆化搜索

int dfs(vector& nums,int n, vector& dp)
{
	if (dp[n]!=-1)//测试用例出现了店里一分钱都没有....
		return dp[n];

	dp[n] = max(dfs(nums, n - 1, dp), dfs(nums, n - 2, dp)+nums[n]);

	return dp[n];

		
	

}

int main()
{
	vectornums = { 0,0,0 };
	if (nums.size() == 1)
	{
		cout << nums[0];
			return 0;
}
	if (nums.size() == 2)
	{
		cout << max(nums[1],nums[0]);
		return 0;
	}
	
	vectordp(nums.size(),-1);
	dp[0]=nums[0];
	dp[1]=(max(nums[0], nums[1]));
	int m = 0;
	m=dfs(nums,nums.size()-1, dp);
	for (auto n : dp)
		cout << n << " ";
	cout << endl;
	cout << m;
}












//dfs暴力
/*
int dfs(vector& nums,int n, vector& dp)
{
	int ans = 0;
	if (n == 1)
		return dp[1];
	if (n == 0)
		return dp[0];
	
	ans= max(dfs(nums, n-1, dp),dfs(nums,n-2,dp)+nums[n]);
	return ans;

}

int main()
{
	vectornums = { 2,1,1,2 };
	if (nums.size() == 1)
	{
		cout << nums[0];
			return 0;
}
	if (nums.size() == 2)
	{
		cout << max(nums[1],nums[0]);
		return 0;
	}
	
	vectordp;
	dp.push_back(nums[0]);
	dp.push_back(max(nums[0], nums[1]));
	int m = 0;
	int sum = 0;
	m=dfs(nums,2,dp);
	cout << m;
}
*/






//标准答案

/*
int main()
{
	vectornums = { 2,1,1,2 };
	vectordp;
	dp.push_back(nums[0]);
	dp.push_back(max(nums[0], nums[1]));
	for (int i = 2;i < nums.size();i++)
	{
		dp.push_back(max(nums[i] + dp[i - 2], dp[i - 1]));

	}
	for (auto n : dp)
		cout << n << " ";
	cout << endl;
	cout << dp[nums.size() - 2];
}

*/

















//自己写的,前n-1项和前n-2项的最大值

/*int main()
{
	//先写dp数组,观察规律
	// 看看能不能从已知推未知,拆子问题
	//打印dp数组
	vectordp;
	vector nums = { 2,1,1,2,2};]
	\

	if (nums.size() == 1)
	{
		cout << nums[0];
		return 0;
	}
	if (nums.size() == 2)
	{
		cout << max(nums[0],nums[1]);
		return 0;
	}
	if (nums.size() == 3)
	{
		cout << max(nums[1],nums[0]+nums[2]);
		return 0;
	}
	int t = nums.size();
	int m = nums[0];
	dp.push_back(nums[0]);
	dp.push_back(nums[1]);
	dp.push_back(nums[2] + nums[0]);
	for (int i = 1;dp.size()!=nums.size();i++)
	{

		m = max(m, dp[i]);
		
		dp.push_back(m + nums[i+2]);


	}
	for (auto n : dp)
		cout << n << " ";
	cout << endl;
    
	cout << max(dp[t - 1], dp[t - 2]);


	return 0;
}
*/

你可能感兴趣的:(leetcode,算法,深度优先)