一个DP套路
题目描述
简述:给一些物品,两维重量,一维价值,求取一些物品满足第一种重量和不大于,第二种重量和不小于时,价值的最小值。
这东西我第一眼看甚至都不敢保证能不能过,~后来发现我弱到只能写~。
暴力自然比较好想,就是开三维,一维下标,二维重量一,三维重量二,内容存最小价值。
咋做到呢,看到限制里面有,想一下,有什么用处?
既然的和蹭线就行的和不过线就行,那我们其实可以通融通融,把它们的值向中间收束,反正他俩只是状态,和答案的值没关系,过线的部分少一点不影响他已经过线的事实,没过的部分多一点也不影响他没过的状态,这样我们就可以把两个状态合并,把一个物品当成一组物品,每组物品至多取一个,物品只有一个重量,组内价值都是原来物品的价值,物品的唯一重量在组内恰好把这个区间覆盖一遍,这样一来,再按类似原来的方法,只不过一维下标,二维重量,内容存价值。
这么看好像还不够,毕竟区间一大就又完蛋,但其实不是,单调队列维护区间最小值,设当前遍历到的物品是已达的重量是,那么转移就是$$f[i][j]=min(f[i-1][j],\min^{j-b[i]}_{k=j-a[i]}(f[i-1][k]+c[i]))$$
最终答案就是,因为按上面的方法拆完物品后,一定会有合法最优解卡在
总结:算是一种套路吧,就有一种只用满足状态的大于小于关系的可以为了优化时间来在规则允许的情况下收束来减少状态数。~(可能有什么神展开但我智力有限一时半会无法想象,等以后遇到类似的再说吧)~
1 | #include<bits/stdc++.h> |
修订记录
- 2023年10月12日 创建文章