P2224 [HNOI2001]产品加工(进程dp)
发布日期:2021-06-30 10:20:49 浏览次数:2 分类:技术文章

本文共 1529 字,大约阅读时间需要 5 分钟。

这种dp见过,但还是完全没思路呢…

首 先 状 态 太 多 , 考 虑 用 数 组 的 值 储 存 状 态 , 具 体 的 意 思 是 首先状态太多,考虑用数组的值储存状态,具体的意思是 ,,

d p [ i ] [ j ] 表 示 做 完 前 i 个 任 务 , A 机 器 花 费 j 时 间 , B 机 器 花 费 的 最 小 时 间 dp[i][j]表示做完前i个任务,A机器花费j时间,B机器花费的最小时间 dp[i][j]i,Aj,B

那 么 转 移 也 非 常 显 然 , 每 次 枚 举 A 机 器 的 时 间 s 那么转移也非常显然,每次枚举A机器的时间s ,As

当 第 i 个 任 务 由 A 机 器 完 成 时 当第i个任务由A机器完成时 iA

d p [ i ] [ s ] = d p [ i − 1 ] [ s − a ] dp[i][s]=dp[i-1][s-a] dp[i][s]=dp[i1][sa]

当 第 i 个 任 务 由 B 机 器 完 成 时 当第i个任务由B机器完成时 iB

d p [ i ] [ s ] = d p [ i − 1 ] [ s ] + b dp[i][s]=dp[i-1][s]+b dp[i][s]=dp[i1][s]+b

当 第 i 个 任 务 被 共 同 完 成 时 当第i个任务被共同完成时 i

d p [ i ] [ s ] = d p [ i − 1 ] [ s − c ] + c dp[i][s]=dp[i-1][s-c]+c dp[i][s]=dp[i1][sc]+c

因 为 时 间 空 间 比 较 紧 , 加 了 一 点 优 化 在 代 码 里 因为时间空间比较紧,加了一点优化在代码里 ,

#include 
using namespace std;int a,b,c,dp[2][30009],sumn,n;int main(){ cin >> n; memset(dp,127,sizeof(dp)); dp[0][0]=0; int start=0; for(int i=1;i<=n;i++) { int t=(i&1); scanf("%d%d%d",&a,&b,&c); memset(dp[t],127,sizeof(dp[t]) ); int inf=dp[t][0]; sumn+=max(a,max(b,c) ); for(int j=start;j<=sumn;j++) { if( a&&j-a>=0 ) dp[t][j]=min( dp[t][j],dp[t^1][j-a] ); if( b ) dp[t][j]=min( dp[t][j],dp[t^1][j]+b ); if( c&&j-c>=0 ) dp[t][j]=min( dp[t][j],dp[t^1][j-c]+c); } for(int j=start;j<=sumn;j++ ) { if( dp[i&1][j]==inf ) start++; else break; } } int ans=1e9; for(int i=0;i<=30000;i++) ans=min( ans,max( dp[n&1][i],i) ); cout << ans;}

转载地址:https://issue-is-vegetable.blog.csdn.net/article/details/108260811 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:P1646 [国家集训队]happiness(最小割模型)
下一篇:P3205 [HNOI2010]合唱队(区间dp)

发表评论

最新留言

不错!
[***.144.177.141]2024年04月11日 13时27分43秒