四边形不等式优化


四边形不等式定义

在oi历程中,常有如下的dp转移方程

\(f(i,j)=min(f(i,k)+f(k+1,j)+w(i,j))\) \((i<=k<j)\)
\(f(i,j)=inf\) \((i>j)\)
\(f(i,j)=0\) \((i==j)​\)

根据转移,可以看出这是个\(O(n^3)\)的时间复杂度

但是 我们可以根据一些性质,优化部分转移,使其时间复杂度将至\(O(n^2)\)

四边形不等式的定义
如函数\(w\),满足
\(w(i,j')+w(i',j)>= w(i,j)+w(i',j')\) \((i<=i'<j<=j')\)
则称\(w\)是满足四边形不等式的,或称具有凸完全单调性
可记作:交叉小于包含

性质

  1. 若形同上式的\(dp\)方程中,\(w\)函数满足凸完全单调性,则\(f\)也满足凸完全单调性
证明

当\(i==i'\)或\(j==j'\)时
显然成立
------------
当\(i<i'=j<j'\)时
原式=\(w(i,j')+w(j,j') <= w(i,j')\)
设\(k=min(t)(f(i,j')=f(i,t)+f(t+1,j')+w(i,j'))\)
由于对称性(即下文中不等号右面的\(j\),\(k\)可以互换),则设\(k<=j\)

\(f(i,j)+f(j,j')<=f(i,j)+f(k+1.j)+w(i,j)+f(j,j')+w(j,j')\) (因为是最有决策,不等号成立)
\(f(i,j)+f(j,j')<=f(i,j')\)
利用数学归纳法得证
------------
当\(i<i'<j<j'\)时
设\(y=min(t)(f(i',j)=f(i,t)+f(t+1,j')+w(i,j'))\)
设\(z=min(t)(f(i,j')=f(i',t)+f(t+1,j)+w(i',j))\)
由于对称性(同上),可以设\(z<=y\)
\[f(i,j)+f(i',j')<=w(i,j)+w(i',j')+f(i',y)+f(i,z)+f(y+1,j')+f(z+1,j)\];
\[<=w(i,j)+w(i',j')+f(i',y)+f(i,z)+f(z+1,j')+f(y+1,j)\];
\[=f(i,j')+f(i',j)\];
为什么这个东西成立呢?

因为他的成立的必要条件是\(f(i',y)+f(i,z)+f(y+1,j')+f(z+1,j)<=f(i',y)+f(i,z)+f(z+1,j')+f(y+1,j)\)

可以看做是上述问题的规模缩小版。其最终情况会回归到前两种情景。


  1. 决策单调性

我们加速dp所使用的就是决策单调性,四边形不等式是为了引出他

设s(i,j)为f(i,j)的最有决策点

那么有

\(s(i,j)<=s(i,j+1)<=s(i+1,j+1)\)

证明

在\(i>j\) 时
显然成立
-----------------
在\(i<j\)时

为了方便叙述,我们令\(f_k(i,j)\)表示\(f(i,j)\)在\(k\)时的决策值
有\(f_{s(i,j)}(i,j)=f(i,j)\)

由于f满足四边形不等式
所以有
\(f(k,j)+f(k',j+1)<=f(k,j+1)+f(k',j) (k<k'<j)​\)
在不等式两边加上\(w(i,j)+f(i,k-1)+w(i,j+1)+f(i,k'-1)​\)
便可得出
\(f_k(i,j)+f_{k'}(i,j+1) <= f_k(i,j+1)+f_{k'}(i,j)​\)
即\(f_k(i,j)-f_{k'}(i,j)<=f_k(i,j+1)-f_{k'}(i,j+1)​\)

可以发现,可以由左式推出右式
由于在\(s(i,j)​\)右边的决策点来说,必有\(f_k(i,j)>=f(i,j)​\)
还一定有 \(f_s(i,j)(i,j+1)<=f_k(i,j+1)​\)
当然,\(f(i,j)​\)的决策点不一定是\(s(i,j)​\)
但通过我们上面的证明,便可以确定,一定不小于\(s(i,j)​\)
便证明出来了\(s(i,j)<=s(i,j+1)​\)
剩下的一对也可以如此证明

若\(s\)满足上面的关系.则称s关于区间包含关系单调

好(AO) 结束了上面的证明,便可以运用到\(dp\)中去了

这玩意写了我一个晚上qwq,为了保证正确性,边写边证

我们只需要处理这个决策点就可以啦

根据证明,在确定一个大区间\([i,j]\)时,\([i,j-1]\)和\([i+1,j]\)的最有决策点已经确定了。直接在范围内枚举就好了

关于时间复杂度么,不会证

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>using std::max;
using std::min;const int maxn=300;int base[maxn];
int dp[maxn][maxn],s[maxn][maxn];
int MAX[maxn][maxn];int main()
{int n;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&base[i]);base[i+n]=base[i];}for(int i=1;i<=n*2;i++)base[i]+=base[i-1];for(int i=1;i<=n*2;i++)s[i][i]=i;for(int l=2;l<=n;l++)for(int i=1;i<=(n*2)-l+1;i++){int j=i+l-1;int x=s[i][j-1],y=s[i+1][j];dp[i][j]=0x7fffffff;MAX[i][j]=max(MAX[i][j-1],MAX[i+1][j])+base[j]-base[i-1];//最大值不满足四边形不等式,但最有决策一定出现在端点处for(int k=x;k<=y;k++)if(dp[i][k]+dp[k+1][j]+base[j]-base[i-1]<dp[i][j]){dp[i][j]=dp[i][k]+dp[k+1][j]+base[j]-base[i-1];s[i][j]=k;}}int ansMin=0x7fffffff,ansMax=0;for(int i=1;i<n;i++)ansMin=min(ansMin,dp[i][i+n-1]),ansMax=max(ansMax,MAX[i][i+n-1]);printf("%d\n%d",ansMin,ansMax);return 0;
}

转载于:https://www.cnblogs.com/Lance1ot/p/10392691.html

四边形不等式优化-石子合并相关推荐

  1. 合并石子 四边形不等式优化

    题目描述 有一排石子,共n 堆.现要将石子有次序地合并成一堆.规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分.试设计一个算法,计算出将n堆石子合并成一堆的最小得分. ...

  2. Codevs 3002 石子归并 3(DP四边形不等式优化)

    3002 石子归并 3 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次 ...

  3. 四边形不等式优化 --算法竞赛专题解析(10)

    本系列文章将于2021年整理出版,书名<算法竞赛专题解析>. 前驱教材:<算法竞赛入门到进阶> 清华大学出版社 2019.8 网购:京东 当当      作者签名书 如有建议, ...

  4. BZOJXXXX: [IOI2000]邮局——四边形不等式优化初探

    貌似$BZOJ$上并没有这个题... 是嫌这个题水了么... 还是要氪金权限号??? 这里附上洛谷的题面:洛谷P4767 [IOI2000]邮局 题目描述 高速公路旁边有一些村庄.高速公路表示为整数轴 ...

  5. [转]四边形不等式优化dp(POJ1160)

    四边形不等式优化动态规划原理: 1.当决策代价函数w[i][j]满足w[i][j]+w[i'][j']<=w[I;][j]+w[i][j'](i<=i'<=j<=j')时,称w ...

  6. DP 最优二叉树 的四边形不等式优化

    最优比例二叉树.代价函数cost 满足 对任意 a <= b <= c <= d 有 cost[a,c] + cost[b,d] <= cost[a,d] + cost[b,c ...

  7. 【HDU 4905 多校联合】The Little Devil II【DP+四边形不等式优化】

    题意:给出一个数列,每次你可以选择相邻的两个数字进行求GCD,然后得到的数字把这两个数字替代,得到GCD的权值,求最后剩下一个数字后的最大的权值(权值初始是数列的和) 思路:定义dp[i][j]表示区 ...

  8. Post Office(邮局)之四边形不等式优化dp

    目录 前言 题目 解析 四边形不等式优化 何为四边形不等式 何为区间包含单调性 四边形不等式性质 DP 优化 参考代码(附注释) 前言 可以说这道题我可花费了很大功夫才理解的. 其中有些小技巧也是我钻 ...

  9. 【决策单调性分治优化/四边形不等式优化】监狱警卫

    前言 模板一套就AC了... 题目 guardians.cpp 1S/128M 你负责将监狱的警卫指派到最疯狂的罪犯所在的监狱. 一共有N间牢房排列成一行,编号从1~N. 第i间牢房恰好容纳了一个疯狂 ...

最新文章

  1. dnslog在mysql在linux_DNSLog在MySQL注入中的实战
  2. xp下添加linux启动项,grub.cfg--XP+ Ubuntu10.04双系统安装后无XP启动项
  3. MySQL存储过程和游标
  4. jdbc.properties文件
  5. cloud一分钟 | 腾讯金融云总经理胡利明:腾讯云服务金融的“加减 乘除”法。...
  6. 几大主流国产浏览器统一屏蔽996.ICU!
  7. HTML(XHTML)基础知识(三)——【image】
  8. vSphere 5.5 VM整合磁盘失败之—文件被锁定无法访问
  9. php三步运算法,小技巧----“三步翻转法”
  10. php 查找php配置文件php.ini所在路径的二种方法
  11. CSDN上传自己的资源赚积分教程
  12. 异速联服务器虚拟打印怎么设置,金万维异速联6.2.2.0虚拟打印步骤.doc
  13. java分页数据再次进行分页操作
  14. java计算机毕业设计网络教学系统源码+系统+数据库+lw文档
  15. Spark性能优化之通过YDB实现比原生Spark性能高100倍的多表关联
  16. 向工程腐化开炮 | manifest 治理
  17. 【OpenFOAM】学习module1
  18. html做群聊通讯方法,一例完整的websocket实现群聊demo
  19. 增加Router接口
  20. Vue的计算属性computed和监听属性watch

热门文章

  1. String ,StringBuilder,StringBuffer的区分
  2. Java和C语言学习那个比较好?
  3. 5个层次的赚钱模式,看看你是哪一种?
  4. 做自媒体花式撸收益?
  5. 某电子工厂老板感叹创业开厂人生
  6. 老程序员提给后浪程序员的职涯建议
  7. 为什么前端工程师很少用Visual Studio?
  8. 对话框:创建对话框模板和修改对话框属性
  9. 让您的数据库服务器与您对话:直接从SQL Agent Jobs发送电子邮件
  10. Jmeter接口测试---加解密