镇江做网站公司漳州本地企业网站建设服务
news/
2025/10/5 18:02:21/
文章来源:
镇江做网站公司,漳州本地企业网站建设服务,免费自助建站系统平台 贴吧,网站关键词 提醒作者推荐
【动态规划】【广度优先搜索】【状态压缩】847 访问所有节点的最短路径
本文涉及知识点
动态规划汇总
LeetCode879. 盈利计划
集团里有 n 名员工#xff0c;他们可以完成各种各样的工作创造利润。 第 i 种工作会产生 profit[i] 的利润#xff0c;它要求 group[…作者推荐
【动态规划】【广度优先搜索】【状态压缩】847 访问所有节点的最短路径
本文涉及知识点
动态规划汇总
LeetCode879. 盈利计划
集团里有 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) 。 参数 1 n 100 0 minProfit 100 1 group.length 100 1 group[i] 100 profit.length group.length 0 profit[i] 100
动态规划
动态规划的状态表示
pre[j][k]表示 从前i个工作中完成若干任务出动了j人利润为k的盈利计划数。例外kminProfit 时包括利润大于minProfit的盈利计划数。
动态规划的转移方程
前i个任务出动 preCount 人利润为p { d p [ p r e C o u n t ] [ p ] p r e [ p r e C o u n t ] [ p ] 不完成本任务 人数不足无法完成当前任务 p r e C o u n t g r o u p [ i ] n d p [ p r e C o u n t g r o u p [ i ] ] [ m i n ( m i n P r o f i t , p p r o f i t [ i ] ) ] p r e [ p r e C o u n t ] [ p ] 完成本任务 \begin{cases} dp[preCount][p] pre[preCount][p] 不完成本任务 \\ 人数不足无法完成当前任务 preCountgroup[i] n \\ dp[preCountgroup[i]][min(minProfit,pprofit[i])] pre[preCount][p] 完成本任务 \\ \end{cases} ⎩ ⎨ ⎧dp[preCount][p]pre[preCount][p]人数不足无法完成当前任务dp[preCountgroup[i]][min(minProfit,pprofit[i])]pre[preCount][p]不完成本任务preCountgroup[i]n完成本任务
动态规划的初始值
pre[0][0]1
动态规划的填表顺序
i从小到大
动态规划的返回值 ∑ i : 0 p r e . s i z e ( ) − 1 \sum\Large_{i:0 }^{pre.size()-1} ∑i:0pre.size()−1v[i].back()
代码
核心代码
templateint MOD 1000000007
class C1097Int
{
public:C1097Int(long long llData 0) :m_iData(llData% MOD){}C1097Int operator(const C1097Int o)const{return C1097Int(((long long)m_iData o.m_iData) % MOD);}C1097Int operator(const C1097Int o){m_iData ((long long)m_iData o.m_iData) % MOD;return *this;}C1097Int operator-(const C1097Int o){m_iData (m_iData MOD - o.m_iData) % MOD;return *this;}C1097Int operator-(const C1097Int o){return C1097Int((m_iData MOD - o.m_iData) % MOD);}C1097Int operator*(const C1097Int o)const{return((long long)m_iData * o.m_iData) % MOD;}C1097Int operator*(const C1097Int o){m_iData ((long long)m_iData * o.m_iData) % MOD;return *this;}bool operator(const C1097Int o)const{return m_iData o.m_iData;}C1097Int pow(long long n)const{C1097Int iRet 1, iCur *this;while (n){if (n 1){iRet * iCur;}iCur * iCur;n 1;}return iRet;}C1097Int PowNegative1()const{return pow(MOD - 2);}int ToInt()const{return m_iData;}
private:int m_iData 0;;
};class Solution {
public:int profitableSchemes(int n, int minProfit, vectorint group, vectorint profit) {vectorvectorC1097Int pre(n 1, vectorC1097Int(minProfit 1));pre[0][0] 1;for (int i 0; i group.size(); i){auto dp pre;//不完成当前任务for (int preCount 0; preCount n; preCount){for (int p 0; p minProfit; p){const int iNewCount preCount group[i];if (iNewCount n){continue;}const int iNewProfit min(minProfit, p profit[i]);dp[iNewCount][iNewProfit] pre[preCount][p];}}pre.swap(dp);}C1097Int biRet;for (const auto v : pre){biRet v.back();}return biRet.ToInt();}
};测试用例 templateclass T
void Assert(const T t1, const T t2)
{assert(t1 t2);
}templateclass T
void Assert(const vectorT v1, const vectorT v2)
{if (v1.size() ! v2.size()){assert(false);return;}for (int i 0; i v1.size(); i){Assert(v1[i], v2[i]);}}int main()
{ int n, minProfit;vectorint group, profit;{Solution sln;n 5, minProfit 3, group { 2, 2 }, profit { 2, 3 };auto res sln.profitableSchemes(n, minProfit, group, profit);Assert(res, 2);}{Solution sln;n 10, minProfit 5, group { 2, 3, 5 }, profit { 6, 7, 8 };auto res sln.profitableSchemes(n, minProfit, group, profit);Assert(res, 7);}}2023年 1月第一版
class CBigMath { public: static void AddAssignment(int* dst, const int iSrc) { *dst (dst iSrc) % s_iMod; } static void AddAssignment(int dst, const int iSrc, const int iSrc1) { *dst (*dst iSrc) % s_iMod; *dst (dst iSrc1) % s_iMod; } static void AddAssignment(int dst, const int iSrc, const int iSrc1, const int iSrc2) { *dst (*dst iSrc) % s_iMod; *dst (*dst iSrc1) % s_iMod; *dst (dst iSrc2) % s_iMod; } static void SubAssignment(int dst, const int iSrc) { *dst (s_iMod - iSrc *dst) % s_iMod; } static int Add(const int iAdd1, const int iAdd2) { return (iAdd1 iAdd2) % s_iMod; } static int Mul(const int i1, const int i2) { return((long long)i1 i2) % s_iMod; } private: static const int s_iMod 1000000007; }; class Solution { public: int profitableSchemes(int n, int minProfit, vector group, vector profit) { m_minProfit minProfit; vector pre((n 1)(minProfit 1)); pre[0] 1; int iMaxN 0; int iMaxProfit 0; for (int i 0; i group.size(); i) { vector dp pre; for (int j 0; j iMaxN; j) { for (int k 0; k iMaxProfit; k) { const int iNewN j group[i]; if (iNewN n) { //员工不足 continue; } const int iNewProfit min(minProfit, k profit[i]); CBigMath::AddAssignment(dp[GetIndex(iNewN, iNewProfit)], pre[GetIndex(j, k)]); } } pre.swap(dp); iMaxN min(n, iMaxN group[i]); iMaxProfit min(minProfit, iMaxProfit profit[i]); } int iNum 0; for (int i 0; i iMaxN; i) { CBigMath::AddAssignment(iNum ,pre[GetIndex(i, minProfit)]); } return iNum; } inline int GetIndex(int n, int pro) { return n *(m_minProfit 1) pro; } int m_minProfit; };
2023年1月版
class CBigMath { public: static void AddAssignment(int* dst, const int iSrc) { *dst (dst iSrc) % s_iMod; } static void AddAssignment(int dst, const int iSrc, const int iSrc1) { *dst (*dst iSrc) % s_iMod; *dst (dst iSrc1) % s_iMod; } static void AddAssignment(int dst, const int iSrc, const int iSrc1, const int iSrc2) { *dst (*dst iSrc) % s_iMod; *dst (*dst iSrc1) % s_iMod; *dst (dst iSrc2) % s_iMod; } static void SubAssignment(int dst, const int iSrc) { *dst (s_iMod - iSrc *dst) % s_iMod; } static int Add(const int iAdd1, const int iAdd2) { return (iAdd1 iAdd2) % s_iMod; } static int Mul(const int i1, const int i2) { return((long long)i1 i2) % s_iMod; } private: static const int s_iMod 1000000007; }; class Solution { public: int profitableSchemes(int n, int minProfit, vector group, vector profit) { m_minProfit minProfit; vector pre((n 1)(minProfit 1)); pre[0] 1; int iMaxN 0; int iMaxProfit 0; for (int i 0; i group.size(); i) { vector dp pre; for (int j 0; j iMaxN; j) { for (int k 0; k iMaxProfit; k) { const int iNewN j group[i]; if (iNewN n) { //员工不足 continue; } const int iNewProfit min(minProfit, k profit[i]); CBigMath::AddAssignment(dp[GetIndex(iNewN, iNewProfit)], pre[GetIndex(j, k)]); } } pre.swap(dp); iMaxN min(n, iMaxN group[i]); iMaxProfit min(minProfit, iMaxProfit profit[i]); } int iNum 0; for (int i 0; i iMaxN; i) { CBigMath::AddAssignment(iNum ,pre[GetIndex(i, minProfit)]); } return iNum; } inline int GetIndex(int n, int pro) { return n *(m_minProfit 1) pro; } int m_minProfit; }; 扩展阅读
视频课程
有效学习明确的目标 及时的反馈 拉伸区难度合适可以先学简单的课程请移步CSDN学院听白银讲师也就是鄙人的讲解。 https://edu.csdn.net/course/detail/38771
如何你想快
速形成战斗了为老板分忧请学习C#入职培训、C入职培训等课程 https://edu.csdn.net/lecturer/6176
相关
下载
想高屋建瓴的学习算法请下载《喜缺全书算法册》doc版 https://download.csdn.net/download/he_zhidan/88348653
我想对大家说的话闻缺陷则喜是一个美好的愿望早发现问题早修改问题给老板节约钱。子墨子言之事无终始无务多业。也就是我们常说的专业的人做专业的事。如果程序是一条龙那算法就是他的是睛
测试环境
操作系统win7 开发环境 VS2019 C17 或者 操作系统win10 开发环境 VS2022 **C
17** 如无特殊说明本算法用**C**实现。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/928558.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!