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

【动态规划】二维的背包问题、似包非包、卡特兰数

📝前言说明:

  • 本专栏主要记录本人的动态规划算法学习以及LeetCode刷题记录,按专题划分
  • 每题主要记录:(1)本人解法 + 本人屎山代码;(2)优质解法 + 优质代码;(3)精益求精,更好的解法和独特的思想(如果有的话)
  • 文章中的理解仅为个人理解。如有错误,感谢纠错

🎬个人简介:努力学习ing
📋本专栏:C++刷题专栏
📋其他专栏:C语言入门基础,python入门基础,C++学习笔记,Linux
🎀CSDN主页 愚润泽

你可以点击下方链接,进行不同专题的动态规划的学习

点击链接开始学习
斐波那契数列模型路径问题
简单多状态(一)简单多状态(二)
子数组系列(一)子数组系列(二)
子序列问题(一)子序列问题(二)
回文串(一)回文串(二)
两个数组dp问题(一)两个数组的dp问题(二)
01背包问题完全背包
二维的背包问题其他

题单汇总链接:点击 → 题单汇总

题目

  • 474. 一和零
    • 优质解
  • 879. 盈利计划
    • 优质解
  • 377. 组合总和 Ⅳ(似包非包)
    • 优质解
  • 96. 不同的二叉搜索树(卡特兰数)
    • 优质解


474. 一和零

题目链接:https://leetcode.cn/problems/ones-and-zeroes/description/
在这里插入图片描述


优质解

思路:

  • 二维费用的背包问题:要满足两个条件的背包问题
  • 状态表示:dp[i][j][k]:从前 i 个字符串里面选,0 的个数不超过 j , 1 的个数不超过 k 的子集的所有选法中,字符串最多的个数
  • 状态表示:区分 选 or 不选 第 i 个字符
  • 初始化:当 i == 0,dp的值都为 0
  • 填表顺序:i 从小到大
  • 返回值:dp[len][m][n],len为字符串长度

代码:

class Solution {
public:int findMaxForm(vector<string>& strs, int m, int n) {int len = strs.size();vector<vector<vector<int>>> dp(len + 1, vector<vector<int>>(m + 1, vector<int>(n + 1, 0)));for(int i = 1; i <= len; i++){int a = 0, b = 0;for(auto ch: strs[i - 1]){if(ch == '0') a++;else if(ch == '1') b++;}for(int j = 0; j <= m; j++){for(int k = 0; k <= n; k++){dp[i][j][k] = dp[i - 1][j][k];if(j >= a && k >= b)dp[i][j][k] = max(dp[i][j][k], dp[i - 1][j - a][k - b] + 1);}}}return dp[len][m][n];}
};

时间复杂度:O(len × m × n)
空间复杂度:O(len × m × n)


879. 盈利计划

题目链接:https://leetcode.cn/problems/profitable-schemes/description/

在这里插入图片描述


优质解

思路:

  • TODO(还没做)

代码:

class Solution {
public:int profitableSchemes(int n, int m, vector<int>& g, vector<int>& p){const int MOD = 1e9 + 7; // 注意结果取模int len = g.size();vector<vector<vector<int>>> dp(len + 1, vector<vector<int>>(n + 1, vector<int>(m + 1)));for(int j = 0; j <= n; j++) dp[0][j][0] = 1; // 初始化for(int i = 1; i <= len; i++)for(int j = 0; j <= n; j++)for(int k = 0; k <= m; k++){dp[i][j][k] = dp[i - 1][j][k];if(j >= g[i - 1])dp[i][j][k] += dp[i - 1][j - g[i - 1]][max(0, k - p[i - 1])];dp[i][j][k] %= MOD; // 注意结果取模}return dp[len][n][m];}
};

时间复杂度:
空间复杂度:


377. 组合总和 Ⅳ(似包非包)

题目链接:https://leetcode.cn/problems/combination-sum-iv/description/
在这里插入图片描述


优质解

思路:

  • TODO (还没做)

代码:

class Solution
{
public:int combinationSum4(vector<int>& nums, int target){vector<double> dp(target + 1);dp[0] = 1;for(int i = 1; i <= target; i++)for(auto x : nums)if(x <= i) dp[i] += dp[i - x];return dp[target];}
};

时间复杂度:
空间复杂度:


96. 不同的二叉搜索树(卡特兰数)

题目链接:https://leetcode.cn/problems/unique-binary-search-trees/description/
在这里插入图片描述


优质解

思路:

  • TODO(还没做)

代码:

class Solution
{
public:int numTrees(int n){vector<int> dp(n + 1, 0); // dp[i] 表示: 当结点的数量为 i 个的时候,一共有多少颗 BSTdp[0] = 1; // 空树也是一颗二叉搜索树for (int i = 1; i <= n; i++) // 枚举结点的总数for (int j = 1; j <= i; j++)  // 选择每一个根节点dp[i] += dp[j - 1] * dp[i - j]; // 二叉树总量累加在一起return dp[n];}
};

时间复杂度:
空间复杂度:


🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

http://www.dtcms.com/a/602759.html

相关文章:

  • 接口管理工具PostIn,从安装到入门零基础教程
  • 批量删除广告文件删除指定文件小工具
  • 格式工厂5.20怎么安装?FormatFactory_v5_20.exe安装步骤详解(附安装包)
  • 青岛专业网站建设哪家好江苏省现代化实训基地建设网站
  • 网站建设企业云市场注册公司要多少资金起步
  • 基因组学是生命科学的基础
  • 易语言模块反编译工具|帮助开发者高效分析和优化易语言程序
  • watch监视特定属性
  • 43. LINUX网络编程(1)
  • LLMops与MLOps
  • 织梦本地安装网站wordpress 迁移 ip
  • 网站建设 目标网站怎么做落款
  • 贵阳做网站kuhugz网站结构图怎么做
  • 攻击链重构的具体实现思路和分析报告
  • 免费软件下载网站app交易网站建设具体方案
  • 怎么做非法彩票网站西安搜建站科技网站
  • 怎样做农产品交易平台网站asp网站开发环境
  • 从混沌中见你所见——文生图的逆向浪漫
  • 啊里云服务器怎么做网站建筑设计师要学什么专业
  • 11月12日numpy学习总结——numpy的广播规则
  • 网站建设设计流程步骤万网网站域名多少钱一年
  • Flutter---Dart基础
  • 网站权重怎么看用jsp做校园网站
  • 网页制作与网站建设初学者必看教程杭州网站开发凡客
  • 如何解决解决,微信小程序ios无法长按复制问题<text>设置 selectable=“true“不起作用
  • Linux驱动知识点:容器嵌入机制(Container Embedding)
  • 深圳网站的建设维护公司现代农业建设 乡网站
  • Flutter---异步编程
  • 为什么浙江建设厅网站漯河市建设监理协会网站
  • 中国建设银行海南省分行网站教学活动设计方案模板