Dp 专题
2022/1/25 23:05:32
本文主要是介绍Dp 专题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Konata28
三层:阶段,状态,决策。
Hu Kang
以下均以 01 背包举例。
状态表示
将每一个状态看作一个集合集的属性。
\(f[i,j]\) 表示前 \(i\) 个物品中总体积为 \(j\) 的物品集合集的元素大小和的最大值(属性)。
\(e.g.\)
\[id:1,2,3 \]\[w_i:4,5,9 \]\[v_i:6,8,7 \]\[f[3,9]\to\{\{1,2\},\{3\}\} \]其中 \(\{1,2\}\) 的价值和最大,为 \(6+8=14\),故 \(f[3,9]=14\)
常见的属性有:大小、最值、和、乘积、异或和……
状态转移
对集合集中集合的划分。
将 \(f[i,j]\) 的集合集划分成包含 \(i\) 物品的集合和不包含 \(i\) 物品的集合。
两种情况分别对应 \(f[i-1,j]\) 和 \(f[i-1,j-w_i]+v_i\)。
所以状态转移方程为 \(f[i,j]=\max(f[i-1,j],f[i-1,j-w_i]+v_i)\)。
\(e.g.\)
\[id:1,2,3,4 \]\[w_i:4,5,9,8 \]\[v_i:6,8,7,1 \]\[f[4,13]\to\{\color{blue}{\{1,3\}},\color{red}{\{2,4\}}\} \]蓝色为不含 \(i\) 的,红色为含 \(i\) 的。
再思考,可以用滚动数组优化空间复杂度。
Unknown
拿到一道题,先写出状态转移方程,再优化时间复杂度
状态优化:
对于状态可累加
\(e.g.dp[i+j]=dp[i]+dp[j]+i+j\)
的,用倍增优化
决策优化:
\(e.g.dp[i][j]=\max(dp[i-1][j-233]+(j-233)^2,dp[i-1][j-232]+(j-232)^2,...,dp[i-1][j]+j^2)\)
单调队列优化
\(e.g.dp[i]=\max(dp[1]+i,dp[2]+2i,...,dp[i-1]+(i-1)i)\)
斜率优化
交叉小于包含
\(e.g.dp[i][j]=\max(dp[i][i]+dp[i+1][j],dp[i][i+1]+dp[i+2][j],...,dp[i][j-1]+dp[j-1][j],dp[i][j]+dp[j][j])\)
用四边形不等式优化
这篇关于Dp 专题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南