区间动规平行四边形优化

平行四边形优化,是一种在一类区间动规中减少时间复杂度的方法。

有方程:m(i,j)=min(m(i,k)+m(k+1,j)+w(i,j)),s(i,j)为最优点取到值。

公式:如果有w(i, j)+w(i′, j′)≤w(i′, j)+w(i, j′) 那么我们称函数 w 满足四边形不等式。

   就有s(i, j)≤s(i, j + 1)≤s(i + 1, j + 1)

证明思路如下:

我们先要证明:m(i,j)+m(i′,j′)≤m(i′,j)+m(i,j′),i≤i′< j≤ j′ 。

分部证明,每部都用数学归纳法证明,用前面一部作为初始条件:

  • i=i′或j= j′
  • i<i′= j< j′
  • i<i′< j< j′

然后再证:s(i, j)≤s(i, j + 1)≤s(i + 1, j + 1)

我们令mk (i, j)表示决策变量取k的时候目标函数的值。

有上面证明的加上w(i, j)+m(i,k?1)+w(i, j+1)+m(i,k′?1) 。

构造出:mk (i, j)?mk′ (i, j)≤mk (i, j+1)?mk′ (i, j+1) 。

就能证明s(i, j +1)≥ s(i, j) 。另一边证明同理。

详细证明:http://files.cnblogs.com/files/SXia/DP平行四边形优化.pdf

时间: 2024-08-08 08:43:53

区间动规平行四边形优化的相关文章

动规之区间动规小结

区间动规主要有两种方法: 一.是先想出递归式,然后将之转化为滚动数组. 二.或者从小区间贪到大区间. POJ  1159  点击打开链接 AC代码如下: #include<iostream> #include<cstring> #include<algorithm> using namespace std; char a[5005]; short dp[5005][5005]; int min(int a,int b) { return a<b?a:b; } in

[bzoj1068]压缩[区间动规]

看了lujiaxin的blog,感觉自己好浪啊....好难过 刷题的时候不够投入,每种算法都是只写一两道就过去了,这样怎么可能进步嘛 不要总是抱怨时间太少了 都是自己不努力>_< 好啦 看题 n<=50的范围,记忆化...N^3 f[a][b][t]表示a~b这段区间内,有没有M的最短答案. 枚举断点(很重要的思想),当T==1,显然左边右边都dp一下:(think clearly) 然后,看看左边能不能被压缩,这一句很重要,因为如果区间内没有M的话,它只能是最左边复制呀复制,所以可以保

【BZOJ1010】【HNOI2008】玩具装箱toy 动规_斜率优化

第一道斜率优化题,题解仍然不是很透彻. 我在这里可以推荐一篇博客. http://blog.sina.com.cn/s/blog_5f5353cc0100jx41.html 写得还好,但是可能有一些地方仍说的不是很明白. 我说一下我对斜率优化的理解: 就是发现某道动态规划的题会TLE,然后它又恰巧符合某些丧心病狂的性质时的一种优化. 本质是有限度地捏造出一种性质,使得动规方程满足某种邪恶的单调性,从而得到大幅度的优化. 而这个单调性是怎么得到的呢? 就是我们把原转移状态搞出来,一顿转化,比如把平

区间型动规--石子归并(Pascal)

题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1].问安排怎样的合并顺序,能够使得总合并代价达到最小. 输入描述 Input Description 第一行一个整数n(n<=100) 第二行n个整数w1,w2...wn  (wi <= 100) 输出描述 Output Description 一个整数表示最小合并代价 这是一道经典的区间型动规,若用fmin[i,j]记录合并从

蓝桥杯:合并石子(区间DP+平行四边形优化)

http://lx.lanqiao.cn/problem.page?gpid=T414 题意:…… 思路:很普通的区间DP,但是因为n<=1000,所以O(n^3)只能拿90分.上网查了下了解了平行四边形优化:地址. 但是看不懂. 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 const LL INF = 100000000000000000LL; 5 LL dp[1010][101

POJ 2955 Brackets (动规)

Brackets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2999   Accepted: 1536 Description We give the following inductive definition of a "regular brackets" sequence: the empty sequence is a regular brackets sequence, if s is a reg

【字符串处理+动规】单词的划分

[字符串处理+动规]单词的划分 Time Limit: 1000MS Memory Limit: 2560KB 有一个很长的由小写字母组成字符串.为了便于对这个字符串进行分析,需要将它划分成若干个部分,每个部分称为一个单词.出于减少分析量的目的,我们希望划分出的单词数越少越好.你就是来完成这一划分工作的. 输入格式 第一行,一个字符串.(字符串的长度不超过100)     第二行一个整数n,表示单词的个数.(n<=100)     第3~n+2行,每行列出一个单词. 输出格式     一个整数,

【线性动规】最大子段和

题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 输入文件maxsum1.in的第一行是一个正整数N,表示了序列的长度. 第2行包含N个绝对值不大于10000的整数A[i],描述了这段序列. 输出格式: 输入文件maxsum1.out仅包括1个整数,为最大的子段和是多少.子段的最小长度为1. 输入输出样例 输入样例#1: 7 2 -4 3 -1 2 -4 3 输出样例#1: 4 说明 [样例说明]2 -4 3 -1 2 -4 3 [数据规模与约定] 对于

HDU 2844 Coins (动规)

Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6904    Accepted Submission(s): 2809 Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. One