$Poj3017\ Cut\ The\ Sequence$ 单调队列优化$DP$
Description
给定一个长度为N的序列 A,要求把该序列分成若干段,在满足“每段中所有数的和”不超过M的前提下,让“每段中所有数的最大值”之和最小.
N<=105,M<=1011,0<Ai<=106
Sol
一篇比较清楚的题解 $OvO$
$F[i]$表示把前$i$个数分成若干段,满足每段中所有数之和不超过$M$的前提下,各段的最大值之和的最小值
不难推出转移方程:
但是直接枚举$j$的做法是$O(N^{2})$的,显然过不去,还要优化.
DP转移优化的指导思想是及时排除不可能的决策,保持候选集合的高度有效性和秩序性.
本着这个思想我们来思考怎样的j可能成为最优解.
$j$要满足一下两个条件之一才有可能成为最优解:
1.$A[j+1]=max\ Ak$
2.$\sum_{k=j}^{i}Ak>M$ 即: j是满足区间和小于等于$M$的最小下标
证明,反证法:
假设以上条件都不成立
由以上条件可知$[j,i]$和$[j-1,i]$的区间都是满足题意(区间和$<=M$)且区间最大值相等
又因为显然有$F[j-1]$≤$F[j]$
所以$F[j-1]+max{Ak}<F[j]+max{Ak}$
$j-1$比$j$更优,$j$不可能是最优的
第$1$个条件显然可以维护一个$j$递增,$Aj$递减的单调队列
Code
#include<iostream>
#include<cstdio>
#define il inline
#define Rg register
#define go(i,a,b) for(Rg int i=a;i<=b;i++)
#define yes(i,a,b) for(Rg int i=a;i>=b;i++)
#define ll long long
using namespace std;
il int read()
{
int x=,y=;char c=getchar();
while(c<''||c>''){if(c=='-')y=-;c=getchar();}
while(c>=''&&c<=''){x=(x<<)+(x<<)+c-'';c=getchar();}
return x*y;
}
int n,a[],q[],f[];
ll m,s[];
int main()
{
n=read(),scanf("%lld",&m);
go(i,,n){a[i]=read();s[i]=s[i-]+a[i];if(a[i]>m){printf("-1");return ;}}
int nw=,h=,t=;
go(i,,n)
{
while(s[i]-s[nw-]>m)nw++;
while(h<=t && q[h]<nw)h++;
while(h<=t && a[q[t]]<=a[i])t--;
q[++t]=i;
f[i]=f[nw-]+a[q[h]];
go(j,h,t-)f[i]=min(f[i],f[q[j]]+a[q[j+]]);
}
printf("%d\n",f[n]);
return ;
}
随机推荐
- Navicat连接MySQL8.0版本时 建议升级连接客户端这个提示怎么办
开始->mysql 8.0 command line client ->执行下面的命令//开启mysql服务mysql.server start//进入mysqlmysql -u root ...
- LeetCode69 Sqrt(x)
题意: Implement int sqrt(int x). Compute and return the square root of x.(Medium) 分析: 二分搜索套路题,不能开方开尽的时 ...
- redhat6.5安装yum
1.检查yum是否安装,默认情况下都是安装好的,总共4各包. rpm -qa |grep yum 卸载掉系统redhat自带的yum rpm -qa |grep yum |xargs rpm -e ...
- List of the best open source software applications
List of the best open source software applications by Ryan • Oct 25th, 2008 • Category: Featured Art ...
- 洛谷 3177 [HAOI2015] 树上染色
题目描述 有一棵点数为 N 的树,树边有边权.给你一个在 0~ N 之内的正整数 K ,你要在这棵树中选择 K个点,将其染成黑色,并将其他 的N-K个点染成白色 . 将所有点染色后,你会获得黑点两两之 ...
- Clipboard 自动复制功能,ios复制失败,换方案 user-select: text ;长按复制 (ios 兼容,长按复制)
Clipboard 自动复制功能,嵌套app内跳转的页面,ios 自动复制失败(该ios机子,微信,浏览器打开复制没有问题) 暂时换方案 user-select: text ;长按复制 (ios ...
- java spring使用Jackson过滤
一.问题的提出. 项目使用Spring MVC框架,并用jackson库处理JSON和POJO的转换.在POJO转化成JSON时,希望动态的过滤掉对象的某些属性.所谓动态,是指的运行时,不同的cont ...
- 为什么有的文件从SVN上更新不下来
前几天使用eclipse的插件从SVN上更新代码,将全部的代码更新下来后启动项目,前台报错说有些js文件找不到,后来检查我的工程里确实没有那些文件,经过检查发现SVN上却有这些文件,那为什么更新不下来 ...
- javaScript通过URL获取参数
// 函数方法 function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=( ...
- I/O 端口和 I/O 内存
每个外设都是通过读写它的寄存器来控制. 大部分时间一个设备有几个寄存器, 并且在连 续地址存取它们, 或者在内存地址空间或者在 I/O 地址空间. 在硬件级别上, 内存区和 I/O 区域没有概念上的区 ...