AcWing - 闫氏DP分析法
核心思想:从集合角度来分析DP问题
在我们遇到的DP问题中,一般都是求在一个有限集内的最值,但是这些方案数量一般都是指数级别的,想要一个一个查找出来不太可能。所以DP方法是用来优化这种寻找最优方案的过程的。
DP问题一般来说分析时都要经过两个阶段:
状态表示(化零为整):指把一些具有相似点的方案,划分为一个子集,然后用一个状态来表示它。现在假设我们的状态表示为 \(f[i]\)。
状态表示要从两个角度来分析:
- 集合:\(f[i]\) 表示的集合就是:所有满足xxx条件的集合。正是因为我们的 \(f[i]\) 可以表示一类东西而不是一个东西,这样就可以达到优化的作用。
- 属性:也就是我们状态存的这个值是这个集合的什么东西,也就是最大值/最小值/数量等等。
状态计算(化整为零):先看一下 \(f[i]\) 表示的所有状态是什么:
比如说是这个集合:

然后把它划分成一个个子集(如果求的是数量那么必须不重复;如果求的是最大值就不用管了),我们的划分依据是:寻找最后一个不同点。

如果要求整个状态的最大值的话,我们只需要把这个状态的所有子集的最大值求出来,再把整个集合的最大值求出来就可以了。这样,我们就成功把一个大问题分解成一个个小问题求解出来了。
举例:01背包问题

开始使用闫氏DP分析法!
状态表示:\(f[i][j]\)
- 集合:所有只考虑前 \(i\) 个物品,且总体积不超过 \(j\) 的选法的集合。
- 属性:Max(最大值)
状态计算:

想要取得最大值,只需要得出左边集合的最大值和右边集合的最大值就可以了。
我们来看一下这两个子集分别是什么

完成!这样我们就成功地把这个问题推出来了。
这个问题还可以再继续优化,目前的状态表示是二维的,但是每次我们只会用到第 \(i - 1\) 层的东西,这样就可以用滚动数组来优化了。还有,我们的状态表示的第二维要么是用自己,要么是用比自己小的数,我们就可以从大到小枚举体积,换为一维数组来存储状态。
为什么可以这样呢?如果用一维数组来存储状态,状态转移方程就是这样了:
\(f[j] = max(f[j], f[j - v[i]] +w[i])\)
因为我们是从大到小枚举体积,所以这时的 \(f[j - v[i]]\) 还没有在第 \(i\) 层被更新过;所以此时它存的就是上一层的 \(f[j - v[i]]\),也就是 \(f[i - 1][j - v[i]]\)。
代码:
朴素版
#include <iostream>
#define N 1010
using namespace std;
int n, m;
int v[N], w[N];
int f[N][N];
int main() {
cin >> n >> m;
for (int i = 1; i <= n; ++i) cin >> v[i] >> w[i];
for (int i = 1; i <= n; ++i)
for (int j = 0; j <= m; ++j) {
f[i][j] = f[i - 1][j]; // 左半边的子集
if (j >= v[i]/*右半边的方案是存在的*/) f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]);
}
cout << f[n][m] << '\n';
return 0;
}
优化版
#include <iostream>
#define N 1010
using namespace std;
int n, m;
int v[N], w[N];
int f[N];
int main() {
cin >> n >> m;
for (int i = 1; i <= n; ++i) cin >> v[i] >> w[i];
for (int i = 1; i <= n; ++i)
for (int j = m; j >= v[i]/*就相当于在循环里判断一句j >= v[i]*/; --j)
f[j] = max(f[j], f[j - v[i]] + w[i]);
cout << f[m] << '\n';
return 0;
}
有了闫氏DP分析法,从此再也不怕DP问题!
AcWing - 闫氏DP分析法的更多相关文章
- 【闫式dp分析法】
- Procrustes Analysis普氏分析法
选取N幅同类目标物体的二维图像,并用上一篇博文的方法标注轮廓点,这样就得到训练样本集: 由于图像中目标物体的形状和位置存在较大偏差,因此所得到的数据并不具有仿射不变性,需要对其进行归一化处理.这里采用 ...
- 从Elo Rating System谈到层次分析法
1. Elo Rating System Elo Rating System对于很多人来说比较陌生,根据wikipedia上的解释:Elo评分系统是一种用于计算对抗比赛(例如象棋对弈)中对手双方技能水 ...
- AX中四种库存ABC分析法原理研究
库存ABC分类,简单的说就是抓大放小,是为了让我们抓住重点,用最大精力来管理最重要的物料,而对于不太重要的物料则可以用较少的精力进行管理.它和我们平常说的八二法则有异曲同工之妙. 既然要应用库存ABC ...
- 黑盒测试用例设计方法&理论结合实际 -> 边界值分析法
一. 概念 边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法.通常边界值分析法是作为对等价类划分法的补充,这种情况下,其测试用例来自等价类的边界. 二. 边界值分析法的应用 根据大量的测 ...
- 帕累托分析法(Pareto Analysis)(柏拉图分析)
帕累托分析法(Pareto Analysis)(柏拉图分析) ABC分类法是由意大利经济学家帕雷托首创的.1879年,帕累托研究个人收入的分布状态图是地,发现少数人收入占全部人口收入的大部分,而多数人 ...
- SWOT分析法
SWOT(Strengths Weakness Opportunity Threats)分析法,又称为态势分析法或优劣势分析法,用来确定企业自身的竞争优势(strength).竞争劣势(weaknes ...
- 5W1H分析法
"5W1H分析法"也叫"六何分析法",它是一种分析方法也可以说是一种创造技法.是对选定的项目.工序和操作,都要从原因(Why).对象(What).地点(Wher ...
- 【编译原理】语法分析LL(1)分析法的FIRST和FOLLOW集
近来复习编译原理,语法分析中的自上而下LL(1)分析法,需要构造求出一个文法的FIRST和FOLLOW集,然后构造分析表,利用分析表+一个栈来做自上而下的语法分析(递归下降/预测分析),可是这个FIR ...
- 2017人生总结(MECE分析法)
试着用MECE分析法对人生的整个规划做一下总结.作为技术人员,其实除了编码架构能力之外,分析问题的能力的重要程度也会随着职业发展越来越重要.<美团点评技术博客>说这几天要在黄金时段头版头条 ...
随机推荐
- 【AGC】云监控日志服务查询不到Logger日志相关问题2
[关键字] AGC.云监控.日志服务 [问题描述] 之前有开发者反馈在使用AGC云监控,填写了Logger日志,但是在云监控的日志服务查不到的问题.具体如下所述: 云函数按要求写了Logger日志, ...
- json数据的解析
php声明没有键的数组,用json_encode输出: $array=array("1","2","3"); echo json_encod ...
- 从头学Java17-Stream API(二)结合Record、Optional
Stream API Stream API 是按照map/filter/reduce方法处理内存中数据的最佳工具. 本系列教程由Record讲起,然后结合Optional,讨论collector的设计 ...
- The server time zone value '?泄???????' is unrecognized or represents more t
hibernate配置文件如下 运行在服务器上,报错如下 解决方案: 在jdbc连接的url后面加上serverTimezone=GMT即可解决问题,因为是数据库和系统时区差异所造成的, 即 < ...
- matlab2014a破解不完全,报错Test checkout of feature 'Compiler' failed
解决方案 报错情况: 目标是把.m文件转化为.exe文件,先运行 mcc -m 你的文件.m 如果报错 Test checkout of feature 'Compiler' failed 是因为你的 ...
- typedef和define有什么区别
typedef 和define 都是替一个对象取一个别名,以此增强程序的可读性,区别如下: 使用不用 define 定义后面不用加分号,并且它的别名在对象的前面 typedef需要加分号,并且它的别名 ...
- 西门子PS on eMS Standalone《导入FANUC机器人TP程序》
导入TP程序到PDPS中 右键点击左侧项目树的 "程序" --> 点击 "创建TP程序" 打开示教器 --> 点击"SELECT" ...
- OpenCV4之特征提取与对象检测
1.图像特征概述 图像特征的定义与表示 图像特征表示是该图像唯一的表述,是图像的DNA 图像特征提取概述 传统图像特征提取 - 主要基于纹理.角点.颜色分布.梯度.边缘等 深度卷积神经网络特征提取 - ...
- 代码随想录算法训练营第三天| LeetCode 203.移除链表元素(同时也对整个单链表进行增删改查操作) 707.设计链表 206.反转链表
203.移除链表元素 题目链接/文章讲解/视频讲解::https://programmercarl.com/0203.%E7%A7%BB%E9%99%A4%E9%93%BE%E8%A1 ...
- <学习笔记> 关于二项式反演
1 容斥原理的式子: \[|A1∪A2∪...∪An|=\sum_{1≤i≤n}|Ai|−\sum_{1≤i<j≤n}|Ai∩Aj|+...+(−1)^{n−1}×|A1∩A2∩...∩An| ...