DP的四边形优化
DP的四边形优化
一、进行四边形优化需要满足的条件
1、状态转移方程如下:
m(i,j)表示对应i,j情况下的最优值。
w(i,j)表示从i到j的代价。
例如在合并石子中:
m(i,j)表示从第i堆石子合并到j堆石子合并成一堆的最小代价。
w(i,j)表示从第i堆石子到第j堆石子的重量和。
2、函数w满足区间包含的单调性和四边形不等式
二、满足上述条件之后的两条定理
1、假如函数w满足上述条件,那么函数m 也满足四边形不等式,即
例如:
假如有:w(1, 3) + w(2, 4) £ w(2, 3) + w(1, 4),
m(1, 3) + m(2, 4) £ m(2, 3) + m(1, 4),
2、假如m(i, j)满足四边形不等式,那么s (i, j)单调,即:
三、如何使用
运用上面两条定理,可以将最上面的DP状态转移方程变为如下:
四、具体应用
用四边形优化将合并石子(直线型)的时间复杂度化为 O(n*n)
#include <iostream>
#include <string.h>
#include <stdio.h> using namespace std;
const int INF = << ;
const int N = ; int dp[N][N];
int p[N][N];
int sum[N];
int n; int getMinval()
{
for(int i=; i<=n; i++)
{
dp[i][i] = ;
p[i][i] = i;
}
for(int len=; len<n; len++)
{
for(int i=; i+len<=n; i++)
{
int end = i+len;
int tmp = INF;
int k = ;
for(int j=p[i][end-1]; j<=p[i+1][end]; j++)
{
if(dp[i][j] + dp[j+][end] + sum[end] - sum[i-] < tmp)
{
tmp = dp[i][j] + dp[j+][end] + sum[end] - sum[i-];
k = j;
}
}
dp[i][end] = tmp;
p[i][end] = k;
}
}
return dp[][n];
} int main()
{
while(scanf("%d",&n)!=EOF)
{
sum[] = ;
for(int i=; i<=n; i++)
{
int val;
scanf("%d",&val);
sum[i] = sum[i-] + val;
}
printf("%d\n",getMinval());
}
return ;
}
上述代码具体在内存中的运行过程:
DP的四边形优化的更多相关文章
- HRBUST - 1819 石子合并问题--圆形版(区间dp+环形+四边形优化)
石子合并问题--圆形版 在圆形操场上摆放着一行共n堆的石子.现要将石子有序地合并成一堆.规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆石子数记为该次合并的得分.请编辑计算出将n堆石子合并成一堆的 ...
- 区间dp之四边形不等式优化详解及证明
看了那么久的四边形不等式优化的原理,今天终于要写一篇关于它的证明了. 在平时的做题中,我们会遇到这样的区间dp问题 它的状态转移方程形式一般为dp[i][j]=min(dp[i][k]+dp[k+1] ...
- HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化
HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化 n个节点n-1条线性边,炸掉M条边也就是分为m+1个区间 问你各个区间的总策略值最少的炸法 就题目本身而言,中规中矩的 ...
- HDU 3506 (环形石子合并)区间dp+四边形优化
Monkey Party Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Tot ...
- HDU 2829 Lawrence(四边形优化DP O(n^2))
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2829 题目大意:有一段铁路有n个站,每个站可以往其他站运送粮草,现在要炸掉m条路使得粮草补给最小,粮草 ...
- 51Nod 1022 石子归并 V2(区间DP+四边形优化)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1022 题目大意: N堆石子摆成一个环.现要将石子有次序地合并成 ...
- 【转】斜率优化DP和四边形不等式优化DP整理
(自己的理解:首先考虑单调队列,不行时考虑斜率,再不行就考虑不等式什么的东西) 当dp的状态转移方程dp[i]的状态i需要从前面(0~i-1)个状态找出最优子决策做转移时 我们常常需要双重循环 (一重 ...
- HDOJ 3516 Tree Construction 四边形优化dp
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=3516 题意: 大概就是给你个下凸包的左侧,然后让你用平行于坐标轴的线段构造一棵树,并且这棵树的总曼哈顿 ...
- [bzoj1597][USACO2008]土地购买(DP斜率优化/四边形优化)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1597 分析: 1.先可以把被包含的土地可以去掉,这些土地的长宽肯定都是不会用的,具体先 ...
随机推荐
- ipv4 ipv6 在系统可扩展性方面的应用 支撑公司10-100年的AmazonOrderId
w 如同 基因 生态系统 理念 思维 算法
- Markov Process
w Markov Process -- from Wolfram MathWorld http://mathworld.wolfram.com/MarkovProcess.html 谷歌背后的数学_ ...
- 解决IIS部署网站引用woff/woff2/svg字体报404错误
一.问题 在IIS上部署网站,网页引用woff字体时,浏览器报“找不到woff.woff2字体”.“404”错误,不仅预设的字体加载不出来,还影响网页加载速度. 二.原因 IIS默认设置情况下不识别. ...
- Django 路由系统(URL)
介绍 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. 你就是以这种方式告 ...
- 《Python机器学习》笔记(五)
通过降维压缩数据 在前面已经介绍了几种不同的特征选择技术对数据集进行降维的方法.另一种常用于降维的特征选择方法就是特征抽取.数据压缩也是机器学习领域中的一个重要内容.数据压缩技术可以帮助我们对数据及逆 ...
- 《Python 机器学习》笔记(四)
数据预处理--构建好的训练数据集 机器学习算法最终学习结果的优劣取决于两个主要因素:数据的质量和数据中蕴含的有用信息的数量. 缺失数据的处理 在实际应用过程中,样本由于各种原因缺少一个或多个值得情况并 ...
- 判断数A和数B中有多少个位不相同
1. A & B,得到的结果C中的1的位表明了A和B中相同的位都是1的位:2. A | B, 得到的结果D中的1的位表明了A和B在该位至少有一个为1的位,包含了A 与 B 都是1的位数,经过前 ...
- django的模板系统过滤器笔记
-------------------django内建的过滤器-------------------1.add 使用形式为:{{ value | add: "2"}}意义:将val ...
- 方阵行列式并行化计算(OpenMP,MPI),并计算加速比
00][100].在创建方阵时,方阵的阶数N(N<100)由外部输入.然后用两层"for循环"来给方阵 p左上角 N×N个位置赋值.具体实现如下: /* * 定义矩阵阶数N ...
- gearman管理
通常,Gearman被用来分发任务,以便实现异步操作.下面捋捋如何管理Gearman. 说明:请自行安装好Gearman和PHP PECL Gearman. (我之前安装的gearman php的c语 ...