C++--动态规划其他问题

这篇具有很好参考价值的文章主要介绍了C++--动态规划其他问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.一和零  力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

给你一个二进制字符串数组 strs 和两个整数 mn

请你找出并返回 strs 的最大子集的长度,该子集中 最多m0n1

如果 x 的所有元素也是 y 的元素,集合 x 是集合 y子集

示例 1:

输入:strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3
输出:4
解释:最多有 5 个 0 和 3 个 1 的最大子集是 {"10","0001","1","0"} ,因此答案是 4 。
其他满足题意但较小的子集包括 {"0001","1"} 和 {"10","1","0"} 。{"111001"} 不满足题意,因为它含 4 个 1 ,大于 n 的值 3 。

示例 2:

输入:strs = ["10", "0", "1"], m = 1, n = 1
输出:2
解释:最大的子集是 {"0", "1"} ,所以答案是 2。
class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) 
    {
        int len=strs.size();
        vector<vector<int>> dp(m+1,vector<int>(n+1));
        
        for(int i=1;i<=len;i++)
        {
            int a=0;
            int b=0;
            for(auto sh:strs[i-1])
            {
                if(sh=='0') a++;
                else b++;
            }
            for(int j=m;j>=0;j--)
            {
                for(int k=n;k>=0;k--)
                {
                    dp[j][k]=dp[j][k];
                    if(j>=a&&k-b>=0) dp[j][k]=max(dp[j][k],dp[j-a][k-b]+1);
                }
            }
        }
        return dp[m][n];
    }
};

2.盈利计划  力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

集团里有 n 名员工,他们可以完成各种各样的工作创造利润。

第 i 种工作会产生 profit[i] 的利润,它要求 group[i] 名成员共同参与。如果成员参与了其中一项工作,就不能参与另一项工作。

工作的任何至少产生 minProfit 利润的子集称为 盈利计划 。并且工作的成员总数最多为 n

有多少种计划可以选择?因为答案很大,所以 返回结果模 10^9 + 7 的值

示例 1:

输入:n = 5, minProfit = 3, group = [2,2], profit = [2,3]
输出:2
解释:至少产生 3 的利润,该集团可以完成工作 0 和工作 1 ,或仅完成工作 1 。
总的来说,有两种计划。

示例 2:

输入:n = 10, minProfit = 5, group = [2,3,5], profit = [6,7,8]
输出:7
解释:至少产生 5 的利润,只要完成其中一种工作就行,所以该集团可以完成任何工作。
有 7 种可能的计划:(0),(1),(2),(0,1),(0,2),(1,2),以及 (0,1,2) 。
class Solution {
    const int MOD = 10 ^ 9 + 7;
public:
    int profitableSchemes(int n, int m, vector<int>& g, vector<int>& p)
    {
        int len = g.size();
       
        vector<vector<int>> dp(n + 1, vector<int>(m + 1));
        for (int j = 0; j <= n; j++) dp[j][0] = 1;
        for (int i = 1; i <= len; i++)
        {
            for (int j = n; j>=g[i-1]; j--)
            {
                for (int k=m; k >=0; k--)
                {
                   
                    dp[j][k] += dp[j - g[i - 1]][max(0, k - p[i - 1])];
                    dp[j][k]%=1000000007;
                }
            }
        }
        return dp[n][m];
    }
};

3.组合总和4  力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。

题目数据保证答案符合 32 位整数范围。

示例 1:

输入:nums = [1,2,3], target = 4
输出:7
解释:
所有可能的组合为:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)
请注意,顺序不同的序列被视作不同的组合。

示例 2:

输入:nums = [9], target = 3
输出:0
class Solution {
public:
    int combinationSum4(vector<int>& nums, int target) 
    {
        int n=nums.size();
        vector<double> dp(target+1);
        dp[0]=1;//初始化
        for(int i=1;i<=target;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(i-nums[j]>=0)
                dp[i]+=dp[i-nums[j]];
            }
        }
        return dp[target];
    }
};

4.不同的二叉搜索树  力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

示例 1:

C++--动态规划其他问题,c++,动态规划,开发语言

输入:n = 3
输出:5

示例 2:文章来源地址https://www.toymoban.com/news/detail-694834.html

输入:n = 1
输出:1
class Solution {
public:
    int numTrees(int n) 
    {
        vector<int> dp(n+1);
        dp[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];
    }
};

到了这里,关于C++--动态规划其他问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 0-1背包问题(Knapsack Problem)-动态规划方法(C语言递归和迭代)

    前言 背包0-1问题属于典型的求最大/最小子集问题范畴,它不像rod-cutting或matrix-chain-multiplication等问题,求解过程是按照单位等增或单位递减,0-1背包问题属于在集合范围内的某一个值,而且这些值大概率不是连续值。 问题描述 假定有N件物品,每件物品具有特定的价值value

    2024年02月06日
    浏览(40)
  • 动态规划算法解决背包问题,算法分析与C语言代码实现,时间效率解析

    🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨,经典算法的解析✨都在这儿,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列专栏 -  数据结构与算法_勾栏听曲_0 🍻欢迎大家  🏹  点赞👍  评论📨  收藏⭐️ 📌个人主

    2023年04月16日
    浏览(47)
  • 【动态规划专栏】-- 回文串问题 -- 动态规划经典题型

    目录 动态规划 动态规划思维(基础) 状态表示(最重要) 状态转移方程(最难) 初始化(细节) 填表顺序(细节) 返回值(结果) 回文子串 ⭐⭐ 【题目解析】  【算法原理】 C++ 算法代码  最长回文子串 ⭐⭐  【题目解析】  【算法原理】 C++ 算法代码   回文串分割

    2024年02月08日
    浏览(46)
  • 【动态规划专栏】-- 01 背包问题 -- 动态规划经典题型

    目录 背包问题概述 01 背包问题 01背包⭐⭐  【算法原理】 第一问 第二问 C++ 算法代码 复杂度分析 【空间优化 - 滚动数组】 C++ 算法代码 复杂度分析 分割等和子集⭐⭐ 【算法原理】  对于类01背包问题 C++ 算法代码  【空间优化 - 滚动数组】  C++ 算法代码 目标和⭐⭐ 【算

    2024年02月05日
    浏览(54)
  • C语言之动态规划

    动态规划(Dynamic Programming)是一种解决复杂问题的优化技术,它通过将问题分解为子问题,并记录子问题的解以避免重复计算,从而实现高效的求解。在C语言中,我们可以利用动态规划算法来解决一系列的问题。本文将介绍动态规划的基本概念并以一个经典的背包问题为例

    2024年01月23日
    浏览(25)
  • 动态规划课堂5-----子序列问题(动态规划 + 哈希表)

    目录 引言: 例题1:最长递增子序列 例题2:最长定差子序列 例题3:最长的斐波那契子序列的长度 例题4:最长等差数列 例题5:等差数列划分II-子序列 结语: 要想解决子序列问题那么就要理解子序列和子数组的区别,二者的定义如下。 子序列: 是由数组派生而来的序列,

    2024年03月13日
    浏览(65)
  • 最大字段和(动态规划,C语言)

    递推关系 对于数组A[]={1,2,3,-4,-3,2,1}, 如果有一个函数endsum(j),求出以位置j为终止点的最大子段和,则满足 if(endsum(j-1)0) endsum(j)=endsum(j-1)+A[j] else endsum(j)=A[j] 因为此时A[j]前面的元素只能降低和 上述递推关系是针对endsum 而最大子段和maxsum= max(endsum(0),endsum(1),...endsum(N-1)) 测

    2024年02月03日
    浏览(33)
  • 动态规划问题实验:数塔问题

    动态规划是一种解决复杂问题的方法,它将一个问题分解为若干个子问题,然后从最简单的子问题开始求解,逐步推导出更复杂的子问题的解,最终得到原问题的最优解。动态规划的关键是找到子问题之间的递推关系,以及确定合适的边界条件和初始值。 数塔问题是一个经典

    2024年02月10日
    浏览(39)
  • 动态规划-最长公共子序列(c语言)

    实验 3: 最长公共子序列 内容: 给定两个字符串str1和str2,输出两个字符串的最长公共子序列,如果最长公共子序列为空,则返回“-1”。目前给出的数据,仅仅会存在一个最长的公共子序列。 数据范围: 0 ≤|str1|,|str2|≤2000 要求: 空间复杂度O(n 2 ) 具体思路: step1:

    2024年02月04日
    浏览(49)
  • 蓝桥杯:最优包含--动态规划(C语言)

    1、S串用i进行遍历,T串用j进行遍历。 2、dp数组[i][j]的含义:S串中从S[0]到S[i],最少修改dp[i][j]个字符,可以包含T串中从T[0]到T[j]这部分字符串。 3、遍历时遇到的情况有两种: (1)情况一:S[i]==T[j]        dp[i][j]=min(dp[i-1][j],dp[i-1][j-1]);        dp[i-1][j]的含义:S[0]到S[i-1]中

    2024年02月16日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包