动态规划的各种优化 | 清逸
题意:产品的生产需要m(≤105)个步骤,每个步骤可以在n(≤5)个机器中任何一台完成,机器i完成第j个步骤的时间为ai,j。把半成品从一台机器上搬到另一台机器上也需要一定的时间k,每台机器最多只能连续完成产品的l(≤5∗104)个步骤,问最短需要多长时间。
题解:朴素的动态规划的算法:定义dp[i][j]表示前i个步骤,最后一段步骤用第j个机器完成,sum[i][j]表示前i个步骤用第j个机器完成的时间。状态转移方程:
dp[i][j]=min{dp[t][p]+(sum[i][j]−sum[t][j])+k},(j≠p,i−t≤l)
时间复杂度:O(n2ml)。
把方程式变形得:
dp[i][j]=min{dp[t][p]−sum[t][j]}+sum[i][j]+k,(j≠p,i−t≤l)
发现括号内的式子是根据t决定的(枚举p和j),所以可以用单调队列维护一个单调递增的序列进行优化,时间复杂度:O(n2m)
Read full article from 动态规划的各种优化 | 清逸
No comments:
Post a Comment