DP玄学优化——斜率优化】的更多相关文章

--以此博客来悼念我在\(QBXT\)懵逼的时光 \(rqy\; tql\) (日常%\(rqy\)) 概念及用途 斜率优化是\(DP\)的一种较为常用的优化(据说在高中课本里稍有提及),它可以用于优化这样的一种\(DP\)式子 \[dp[i]=a[i]+\max(y_j-k_ix_j)\;\;\; j\in[1,i-1]\] 原理 以下均以上面的\(DP\)方程为例 如果我们将上式中的\((x_j,y_j)\)画到坐标系里,然后画一条斜率为\(k_i\)的直线,则这条直线为的方程为\(y=k_…
题意:你有n块木头,每块木头有一个高h和宽w,你可以把高度相同的木头合并成一块木头.你可以选择一些木头消去它们的一部分,浪费的部分是 消去部分的高度 * 木头的宽度,问把n块木头变成恰好m块木头至少要浪费多少木料? 思路:把木头从高到第排序,设dp[i][j]为前i块木头合并成了j块木头的最小花费.因为从大到小排序,所以合并后最后一块木头的高度一定是合并前的第i块木头的高度.那么,容易得出dp转移方程:dp[i][j] = min(dp[k][j - 1] + cal(k, i)),其中cal(…
斜率优化,是一种利用斜率的优化(废话) 关于数论:咕咕咕 部分内容参考自学长 如果有这样的一个状态转移方程: \[f[i]=\min\limits_{j=L_j}^{R_j}\{f[j]+val(j,i)\} \] 如果\(val(j,i)=A(i)+B(j)\)可以用单调队列解决 当\(val(j,i)=(A(i)+B(j))^2\)时,就可以考虑斜率优化. 关键词:斜率,凸包,单调队列 特别行动队 看到这题,暴力\(DP\)应该比较好想: \[f[i]=\max\limits^{i-1}_{…
#0.0 屑在前面 将结合经典例题 「HNOI2008」玩具装箱 以及 「NOI2007」货币兑换 进行讲解. #1.0 简述 #1.1 适用情况 斜率优化一般适用于状态转移方程如下的 DP \[f_i=\mathop{\min/\max}\limits_{0\leq j<i}\{a_i\cdot b_j + c_i + d_j\}, \] 其中 \(a_i,b_j,c_i, d_j\) 在计算 \(f_i\) 时都是常数(已知量). #1.2 大致思想 为了方便叙述,下文中的方程都采用 \(f…
题意:https://www.luogu.com.cn/problem/P3195 思路:https://www.luogu.com.cn/problemnew/solution/P3195 #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>//sprintf islower isupper #include <cstdlib>//malloc exit strcat itoa system…
[学习笔记]动态规划-斜率优化DP(超详细) [前言] 第一次写这么长的文章. 写完后感觉对斜优的理解又加深了一些. 斜优通常与决策单调性同时出现.可以说决策单调性是斜率优化的前提. 斜率优化 \(DP\),顾名思义就是利用斜率相关性质对 \(DP\) 进行优化. 斜率优化通常可以由两种方式来理解,需要灵活地运用数学上的数形结合,线性规划思想. 对于这样形式的 \(dp\) 方程:\(dp[i]=Min/Max(a[i]∗b[j]+c[j]+d[i])\),其中 \(b\) 严格单调递增. 该方…
1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 3478  Solved: 1586[Submit][Status][Discuss] Description Input Output Sample Input 4 -1 10 -20 2 2 3 4 Sample Output 9 HINT Source Solution 题意非常明显,将n个数划分成多段区间,使得总价值最大,每段区间的价值为$powersu…
题目描述 给你一个数列,让你将这个数列分成若干段,使其每一段的和的\(a \times sum^2 + b \times sum + c\)的总和最大. 分析 算是一道斜率优化的入门题. 首先肯定是考虑\(O(n^2)\)的暴力DP. 定义状态\(f[i]\)表示最后一段的结尾是\(i\)的最大答案. 那么枚举j,得到转移方程为\(f[i]=max(f[i],f[j]+a\times (sum[i]-sum[j])^2+b\times(sum[i]-sum[j])+c\) 注意这里的转移方程不是…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3437 [题目大意] n个牧场排成一行,需要在某些牧场上面建立控制站, 每个牧场上只能建立一个控制站,每个控制站控制的牧场 是它所在的牧场一直到它西边第一个控制站的所有牧场 它西边第一个控制站所在的牧场不被控制,如果它西边不存在控制站, 那么它控制西边所有的牧场,每个牧场被控制都需要一定的花费, 而且该花费等于它到控制它的控制站之间的牧场数目乘上该牧场的放养量, 在第i个牧场建立控制站…
原题连接:http://acm.hdu.edu.cn/showproblem.php?pid=1300 题意: 题目太长了..自己看吧 题解: 看懂题目,就会发现这是个傻逼dp题,斜率优化一下就好 代码: #include<iostream> #include<cstring> #include<vector> #include<cstdio> #define MAX_N 500 using namespace std; typedef long long…