当前位置: 首页 > news >正文

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

四边形不等式优化


四边形不等式定义

在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

相关文章:

  • 机器学习笔记(一)线性回归
  • 【OCP-12c】CUUG 071题库考试原题及答案解析(18)
  • 锋利的jQuery-7--编写插件基础知识
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • 【持续跟新】剑指Offer_Java实现
  • js,jq发送短信倒计时
  • Ubuntu软件包管理命令全面集锦
  • 资深项目经理推荐的几款免费/开源项目管理工具
  • Linux上mysql修改密码
  • V4L2视频输入框架概述
  • 20171107--SQL变量,运算符,存储过程
  • 国内首例:飞步无人卡车携手中国邮政、德邦投入日常运营
  • 过了半年才写了篇博客,我心情也很悲伤啊,加班加到死,已经浑浑噩噩了
  • bootstrap 的 datetimepicker 结束时间大于开始时间
  • 设计模式之-代理模式
  • ----------
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • co模块的前端实现
  • java2019面试题北京
  • JavaScript DOM 10 - 滚动
  • 创建一个Struts2项目maven 方式
  • 分布式任务队列Celery
  • 警报:线上事故之CountDownLatch的威力
  • 前嗅ForeSpider中数据浏览界面介绍
  • 浅谈Golang中select的用法
  • 驱动程序原理
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 无服务器化是企业 IT 架构的未来吗?
  • 延迟脚本的方式
  • 原生Ajax
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • ​2021半年盘点,不想你错过的重磅新书
  • ​TypeScript都不会用,也敢说会前端?
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (八)c52学习之旅-中断实验
  • (多级缓存)缓存同步
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (一)为什么要选择C++
  • (转)EXC_BREAKPOINT僵尸错误
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .Net6 Api Swagger配置
  • .NET成年了,然后呢?
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET简谈设计模式之(单件模式)
  • .net流程开发平台的一些难点(1)
  • [C++]18:set和map的使用
  • [CQOI 2010]扑克牌
  • [Docker]六.Docker自动部署nodejs以及golang项目
  • [git]git命令如何取消先前的配置