当前位置: 首页 > article >正文

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

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

推是求答案,回溯是给答案
这里图片给出dfs暴力,再进行记录答案完成记忆化搜索,再转为dp数组


#include<iostream>
#include<vector>
#include<algorithm>
//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<int>& nums,int n, vector<int>& 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()
{
	vector<int>nums = { 0,0,0 };
	if (nums.size() == 1)
	{
		cout << nums[0];
			return 0;
}
	if (nums.size() == 2)
	{
		cout << max(nums[1],nums[0]);
		return 0;
	}
	
	vector<int>dp(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<int>& nums,int n, vector<int>& 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()
{
	vector<int>nums = { 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;
	}
	
	vector<int>dp;
	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()
{
	vector<int>nums = { 2,1,1,2 };
	vector<int>dp;
	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数组
	vector<int>dp;
	vector<int> 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;
}
*/


http://www.kler.cn/a/527654.html

相关文章:

  • React第二十八章(css modules)
  • 解读 DeepSeek 关键 RL 算法 GRPO
  • 【linux】Linux 常见目录特性、权限和功能
  • .NET MAUI 入门学习指南
  • 【C++ 真题】P1706 全排列问题
  • Vue.js `setup()` 函数的使用
  • 简要介绍C++中的 max 和 min 函数以及返回值
  • TensorFlow 简单的二分类神经网络的训练和应用流程
  • Git 常用命令汇总
  • 3.Spring-事务
  • 冯诺依曼结构和进程概念及其相关的内容的简单介绍
  • 99.23 金融难点通俗解释:小卖部经营比喻PPI(生产者物价指数)vsCPI(消费者物价指数)
  • 谈谈你所了解的AR技术吧!
  • 本地部署 DeepSeek 模型并使用 WebUI 调用
  • 32. C 语言 安全函数( _s 尾缀)
  • 1.31 实现五个线程的同步
  • 前端知识速记—JS篇:箭头函数
  • 力扣hot100--2
  • 比较器使用
  • FIDL:Flutter与原生通讯的新姿势,不局限于基础数据类型
  • 剑指offer 字符串 持续更新中...
  • 使用Pygame制作“动态烟花”
  • 基于互联网+智慧水务信息化整体解决方案
  • unity学习25:用 transform 进行旋转和移动,简单的太阳地球月亮模型,以及父子级关系
  • 【Pandas】pandas Series diff
  • C语言指针专题二 -- 字符指针与字符串