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

【代码随想录_Day30】1049. 最后一块石头的重量 II 494. 目标和 474.一和零

Day30 OK,今日份的打卡!第三十天

  • 以下是今日份的总结
    • 最后一块石头的重量 II
    • 目标和
    • 一和零

以下是今日份的总结

1049 最后一块石头的重量 II
494 目标和
474 一和零

今天的题目难度不低,掌握技巧了就会很简单,尽量还是写一些简洁代码 ^ _ ^

最后一块石头的重量 II

思路:

1.确定dp数组以及下标的含义
------ dp[j]表示容量(这里说容量更形象,其实就是重量)为j的背包,最多可以背最大重量为dp[j]。
2.确定递推公式
------01背包的递推公式为:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
------本题 :dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);
3.dp数组如何初始化
------因为重量都不会是负数,所以dp[j]都初始化为0就可以了
4.确定遍历顺序
------如果使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒序遍历!
5.举例推导dp数组

值得注意的是

最后dp[target]里是容量为target的背包所能背的最大重量。
在计算target的时候,target = sum / 2 因为是向下取整,所以sum - dp[target] 一定是大于等于dp[target]的。
那么相撞之后剩下的最小石头重量就是 (sum - dp[target]) - dp[target]。

//二维dp数组实现int lastStoneWeightII(vector<int>& stones) {vector<int>dp(15001,0);int sum = 0;//这堆石头的总重量for(int i = 0;i<stones.size();i++) sum += stones[i];int target = sum / 2;//遍历物品for(int i = 0;i < stones.size(); i++){//遍历背包for(int j = target ; j>=stones[i];j--){//不放石头和放石头 中 取最大值 dp[j] = max(dp[j],dp[j - stones[i]]+stones[i]);}       }return sum - dp[target] - dp[target];}

目标和

思路:
既然为target,那么就一定有
left - right = target
left + right = sum
left = (target + sum)/2 。
此时问题就转化为,装满容量为left的背包,有几种方法。

1.确定dp数组以及下标的含义
------ 填满j(包括j)这么大容积的包,有dp[j]种方法
_
2.确定递推公式
------dp[j] += dp[j - nums[i]],没弄明白什么意思,记住就可以了
_
3.dp数组如何初始化
------在初始化的时候dp[0] 一定要初始化为1
_
4.确定遍历顺序
------nums放在外循环,target在内循环,且内循环倒序
_
5.举例推导dp数组

值得注意的是

dp[j] += dp[j - nums[i]];

   int findTargetSumWays(vector<int>& nums, int target) {int sum = 0;for(int i = 0; i < nums.size();i++){sum += nums[i];}//没有方案if((target+sum)%2==1||abs(target)>sum)return 0;int bagSize = (target + sum)/2;vector<int>dp( bagSize + 1,0);dp[0] = 1;for(int i = 0;i<nums.size();i++){for(int j = bagSize;j>=nums[i];j--){dp[j] = dp[j] + dp[j-nums[i]];//求组合类问题的公式,都是类似这种}}return dp[bagSize];}

一和零

思路:
本题中strs 数组里的元素就是物品,每个物品都是一个!
而m 和 n相当于是一个背包,两个维度的背包

1.确定dp数组以及下标的含义
------ dp[i][j]:最多有i个0和j个1的strs的最大子集的大小为dp[i][j]。
2.确定递推公式
------01背包的递推公式为:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
------本题,strs里的字符串有x个0,y个1。
------所以递推公式:dp[i][j] = max(dp[i][j], dp[i - x][j - y] + 1);
------字符串的x和y相当于物品的重量(weight[i]),字符串本身的个数相当于物品的价值(value[i])
3.dp数组如何初始化
------01背包的dp数组初始化为0就可以。
------因为物品价值不会是负数,初始为0,保证递推的时候dp[i][j]不会被初始值覆盖。
4.确定遍历顺序
------一定是外层for循环遍历物品,内层for循环遍历背包容量且从后向前遍历!
5.举例推导dp数组

值得注意的是

这就是一个典型的01背包! 只不过物品的重量有了两个维度而已。

    int findMaxForm(vector<string>& strs, int m, int n) {vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0)); // 初始化全为0for (string str : strs) {int x = 0, y = 0;for (char a : str) {if (a == '0')//统计当前string的‘0’的个数x++;if (a == '1')//统计当前string的‘1’的个数y++;}for (int i = m; i >= x; i--) {for (int j = n; j >= y; j--) {dp[i][j] = max(dp[i][j], dp[i - x][j - y] + 1);}}}return dp[m][n];}

写在最后

----OK,今日份的博客就写到这里,这一期的动态规划好难想,明天继续加油!!!
—还没看下期的题,但是我的栈还有一节没写;
–追不上时间进度了!!又欠了三天的(笑
-🈚️。

http://www.lryc.cn/news/401613.html

相关文章:

  • 【时时三省】tessy 集成测试:小白入门指导手册
  • 通过vagrant与VirtualBox 创建虚拟机
  • 第13章 更多的结构化命令《Linux命令行与Shell脚本编程大全笔记》
  • 【计算机网络】学习指南及导论
  • 安装mitmproxy失败
  • 安装adb和常用命令
  • C++ 几何计算库
  • 云动态摘要 2024-07-16
  • 数仓工具—Hive基础之临时表及示例
  • 机体坐标系和导航坐标系
  • 软件测试——web单功能测试
  • django-ckeditor富文本编辑器
  • 鸿蒙模拟器(HarmonyOS Emulator)Beta申请审核流程
  • VUE:跨域配置代理服务器
  • Redis实战—附近商铺、用户签到、UV统计
  • 小程序里面使用vant ui中的vant-field组件,如何使得输入框自动获取焦点
  • Html_Css问答集(12)
  • 【C语言】条件运算符详解 - 《 A ? B : C 》
  • 乘积量化pq:将高维向量压缩 97%
  • 解决一下git clone失败的问题
  • 【 香橙派 AIpro评测】烧系统运行部署LLMS大模型跑开源yolov5物体检测并体验Jupyter Lab AI 应用样例(新手入门)
  • Azure Repos 仓库管理
  • Day71 代码随想录打卡|回溯算法篇---全排列
  • 开源科学工程技术软件
  • 甄选范文“论软件维护方法及其应用”软考高级论文,系统架构设计师论文
  • 【服务器】端口映射
  • HTC 10 刷系统 LineageOS 19.1 Android 12
  • 访问者模式(Visitor Pattern)
  • mac如何查看cpu和显卡温度
  • MongoDB教程(六):mongoDB复制副本集