首页 > 编程语言 >算法随笔——DP优化

算法随笔——DP优化

时间:2024-07-21 17:51:44浏览次数:18  
标签:huge le 队列 算法 DP 随笔 优化 单调

单调队列优化DP

单调队列模板:

int head = 1,tail = 0;
	for (int i = 1;i <= n;i++)
	{
		while (head <= tail && head 不满足条件) head++;//踢出队列
		f[i] = f[q[head]] + ...;
		while (head <= tail && tail 与 i 不满足单调性) tail--;
		q[++tail] = i;
	}

优化思路则是对于类似于这样的 dp 式:

\[\huge {f_i = \max _{i-M <= j <= i-1}\{ f_j + w \}} \]

在其中求区间最值时,因为其上下限均单调变化,因此可以用单调队列将转移优化到 \(O(1)\) 。

单调队列优化多重背包

单调队列优化多重背包

思路

首先我们列出 dp 式:

\[\huge{f_j = \max_{1 \le cnt \le s _ i} \{ f _ j-cnt*v_i + cnt * w_i \}} \]

我们考虑将第二维 \(V\) 按照除以 \(v_i\) 的余数分组。

对于每个余数 \(u \in [0,v_i-1]\),倒序循环 \(p = (V-u)/v_i\)。
因此可以写出新的状态转移方程:

\[\huge{f_{u + p * v_i} = \max _{p-s_i \le k \le p-1} \{ f_{u + k * v _ i} + (p-k)*w _ i \}} \]

标签:huge,le,队列,算法,DP,随笔,优化,单调
From: https://www.cnblogs.com/codwarm/p/18314697

相关文章

  • 代码随想录算法训练营第15天 | 二叉树进阶
    2024年7月17日平衡二叉树/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode(){}*TreeNode(intval){this.val=val;}*TreeNode(intval,TreeNodeleft......
  • 代码随想录算法训练营第34天 | 贪心算法 5:56.合并区间、738.单调递增的数字
    56.合并区间https://leetcode.cn/problems/merge-intervals/description/代码随想录https://programmercarl.com/0056.合并区间.html738.单调递增的数字https://leetcode.cn/problems/monotone-increasing-digits/description/代码随想录https://programmercarl.com/0738.......
  • Java 随笔记: 集合与泛型
    文章目录1.集合框架概述2.集合接口2.1Collection接口2.2List接口2.3Set接口2.4Map接口3.集合的常用操作3.1添加元素3.2删除元素3.3遍历元素3.4判断大小3.5判断是否为空4.迭代器4.1迭代器的作用4.2迭代器的使用4.3迭代器与增强for循环4.4迭代器......
  • 一文搞懂银行家算法
    在学操作系统的时候,了解到死锁问题,今天在学习并发编程时,也遇到了死锁,在了解了死锁的原因后,遇到一个经典的算法——银行家算法,这是一种避免死锁的算法。在学习完后,我决定总结一下银行家算法的核心思想。什么是死锁?死锁是指在计算机系统中,多个进程或线程因竞争资源或互相等待而......
  • 代码随想录算法训练营第35天 | 动态规划1:509.斐波那契数、70.爬楼梯、746.使用最小花
    代码随想录算法训练营第35天|动态规划理论基础https://programmercarl.com/动态规划理论基础.html#算法公开课509.斐波那契数https://leetcode.cn/problems/fibonacci-number/submissions/548309803/代码随想录https://programmercarl.com/0509.斐波那契数.html#算法公开......
  • 常见的排序算法——堆排序(四)
    本文记述了针对堆排序同时实施减少数据交换和Floyd方法的一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。◆思想减少数据交换的操作,请参考堆排序(二);Floyd方法,请参考堆排序(三)(此处略去详细说明)。◆实现排序代码采用《算法(第4版)》的“排序算法类模板”实现。(......
  • A. Tokitsukaze and Strange Inequality(dp版)
    链接https://codeforces.com/problemset/problem/1677/A题目思路这题感觉还是挺有难度的(为啥题解都说不难Orz),给我启发最大的是这句话:具体怎么处理呢?把i按照n->1的顺序遍历,然后j从反方向遍历:i+1->n。求S[i][j]时用S[i+1][j],因为S对应的是以j为结尾的,然后在遍历中相当于不知......
  • 2024最新子比主题源码zibll-V7.9(含教程) | WordPress主题
    内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍2024最新Zibll子比主题V7.9版本源码开心版|WordPress主题安装教程在压缩包内V7.7更新日志:新功能新增数字翻页输入页码跳转的功能(注:总页数超过8页才会显示)新增后台......
  • 【软考】数据结构与算法基础 - 数组和链表
    一、数组和链表的区别(很简单,但是很常考,记得要回答全面)什么是数组:C++语言中,可以用数组,处理一组数据类型相同的数据,不可以动态定义数组的大小(使用前,必须指定大小。)在实际应用中,用户使用数组之前,无法确定数组的大小只能够将数组定义成足够大小,多余出来空间可能不被使用,......
  • 常见的排序算法——堆排序(三)
    本文记述了针对堆排序实施Floyd方法的基本思想和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。◆思想“大多数在下沉排序期间重新插入堆的元素会被直接加入到堆底。Floyd在1964年观察发现,我们正好可以通过免去检查元素是否到达正确位置来节省时间。”(引......