专栏文章
单调队列优化DP
个人记录参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqaamyy
- 此快照首次捕获于
- 2025/12/04 01:31 3 个月前
- 此快照最后确认于
- 2025/12/04 01:31 3 个月前
算法步骤:
- 第一个元素进队,队头队尾指针指向第一个元素
- 对于其他的N-1个未入队的元素,执行以下操作
for(int i = 1 ; i <= n ; i ++){
cin >> c[i] >> w[i] >> num[i];//c, w, num分别对应 体积 价值 个数
if(V / c[i] < num[i])
num[i] = V / c[i];//求lim
for(int mo = 0; mo < c[i]; mo ++){//枚举余数
head = tail = 0;//队列初始化
for(int k = 0; k <= (V - mo) / c[i]; k++){
int x = k;
int y = dp[k * c[i] + mo] - k * w[i];
while(head < tail && que[head].pos < k - num)head++;//限长度
while(head < tail && que[tail - 1].value <= y)tail --;
que[tail].value = y;
que[tail].pos = x;
tail ++;
dp[k * c[i] + mo] = que[head].value + k * w[i];
//加上k * w[i]的原因:单调队列维护的是前i - 1中的状态最大值
//因此这里加上
}
}
}```
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...