专栏文章

单调队列优化DP

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miqaamyy
此快照首次捕获于
2025/12/04 01:31
3 个月前
此快照最后确认于
2025/12/04 01:31
3 个月前
查看原文
算法步骤:
  • 第一个元素进队,队头队尾指针指向第一个元素
  • 对于其他的N-1个未入队的元素,执行以下操作
CPP
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 条评论,欢迎与作者交流。

正在加载评论...