动态规划浅谈 3/8
前言
本人爆肝写的这份算法学习笔记,希望对于自己的学习和看到的大佬们有一些帮助,文头说明,如果有错,欢迎在评论区dd我(dd我的请你们吃华伦食堂)
内容简介
1.背包问题
2.线性动态规划
3.区间类动态规划
4.树型动态规划
5.数位动态规划
6.单调队列优化动态规划
7.状态压缩动态规划
8.斜率优化动态规划
(我这么弱怎么可能一次学完,会缓慢~~(龟速)~~更新,更新完就删去这句话)
------------
背包问题
1.0/1背包
如果0/1背包还要我告诉你是什么,~~那你退群吧~~左转洛谷网校,里面有专业的导师教导你,%所有洛谷管理员.
留下一个伪代码就可以结束了吧:
for(i=1;i<=n;++i) for(j=v;j>=c[i];--j) f[i][j]=max(f[i-1][j],f[i-1][j-c[i]]+w[i]);
2.完全背包
如果你对于0/1背包理解的比较透彻,那么你一定会研究到为什么第二层循环变量j是逆序循环,其目的在于保证每个物品只会被用一次,所以我们只要改成正序循化就好了,以下是伪代码。
for(int i=1;i<=n;++i) for(int j=c[i];j<=v;++j) f[i][j]=max(f[i-1][j],f[i-1][j-c[i]]+w[i]);
3.多重背包
多重背包这种玄学东西,解题策略就是把某件物品可以取x件变成有x件该物品,那么就转化成了0/1背包来解决,当然还有其他的优化做法,等博主变强就来更新。
线性动态规划
线性动态规划是一类问题。目标函数为特定变量的线性函数,约束是这些变量的线性不等式(standard form)或等式(slack form),目的是求目标函数的最大值或最小值。这类动态规划是平时比较常见的一类动态规划问题。
经典例题:LIS
区间类动态规划
区间类动态规划
适用范围:题目要求将某个区间内的数据合并(或者拆分),以求一个最优解的问题。
按照博主我的理解,事实上区间类动态规划就是线性动态规划的扩展,定义了一个状态f[i][j],表示的是从第i个元素到第j个元素间合并后的最优解(可能是区间内数据和的最大值,可能是合并到一定值的最小次数,因为题目而定),这类动态规划一般比较明显,需要从动态规划起始位置来判断。
接下来是例题
1.[NOI 1995 P1880 石子合并 【普及+/提高-】]
例题解报:[石子合并解报]
2.[P1063 能量项链 【普及+/提高-】]
例题解报:与例题一相似,不做另外解报
------------
## 树型动态规划
TBD
------------
## 数位动态规划
TBD
------------
## 单调队列优化动态规划
TBD
------------
## 状态压缩动态规划
TBD
------------
## 斜率优化动态规划
TBD
------------
END