POj3017 dp+单调队列优化
传送门
解题思路:
大力推公式:dp[i]=min(dp[k]+max(k+1,i)){k>=0&&k<i},max(j,i)记为max(a[h]){h>k&&h<=i},时间复杂度o(n^2)跑不动。考虑有什么冗余的决策可以优化,j到i的累加和记做sum(j,i),所以题目要保证sum(k+1,i)<=m(m为连续子序列和的上限)。
贪心的去想:
第一种情况如果确定max(j,i)==a[j],那么j可以作为一个可能的决策。
第二种情况如果确定max(j,i)==a[j]那么若j和i同属于一个子序列,子序列长度一定越大越好,既存在最小的k使{max(k,i)==a[j]&&sum(k,i)<=m}。至于为什么中间不能出现更优决策点,因为dp[i]>=dp[i-1]一定成立,所以越长越好。
根据上述情况发现,决策在a上具有单调性,所以可以维护一个决策点i单调递增,a[i]单调递减的单调队列。但是这跟正常的单调队列优化dp的套路不一样,队首并不一定是最优决策,所以要同时用multiset维护dp[j]+max(j+1,i)。所以最优决策是multiset的队首与单调队列的队首其中之一。注意的是单调队列要和multiset同时维护,同增同减(恋爱的酸臭味~~)
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<set>
using namespace std;
const int maxn=1e5+;
typedef long long ll;
ll dp[maxn],sum;
int s[maxn],h,t;
int num[maxn];
multiset <int> q;
int main()
{
int n;ll k;scanf("%d%lld",&n,&k);
for(int i=;i<=n;i++){
scanf("%d",&num[i]);
if(num[i]>k){
printf("-1");exit();
}
}
h=;int id=;
for(int i=;i<=n;i++){
sum+=num[i];
while(sum>k) sum-=num[id++];
if(id>i){
printf("-1");exit();
}
while(h<=t&&num[s[t]]<num[i]){
if(h<t)
q.erase(dp[s[t-]]+num[s[t]]);
t--;
}
s[++t]=i;
if(h<t){
q.insert(dp[s[t-]]+num[i]);
}
while(h<=t&&s[h]<id){
if(h<t)
q.erase(dp[s[h]]+num[s[h+]]);
h++;
}
dp[i]=dp[id-]+num[s[h]];
ll t=*q.begin();
if(h<t&&t<dp[i])
dp[i]=t;
}
printf("%lld\n",dp[n]);
}
cout和printf混用这题tle了(没用输入输出优化),求解
看了一下网上的还有下面这种算法不知道是不是数据水了,可以hack可惜没有
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+;
typedef long long ll;
ll dp[maxn],sum[maxn];
int s[maxn],h,t;
int num[maxn];
int main()
{
int n;ll k;scanf("%d%lld",&n,&k);
for(int i=;i<=n;i++){
scanf("%d",&num[i]);sum[i]=sum[i-]+num[i];
if(num[i]>k){
cout<<"-1"<<endl;return ;
}
}
h=;
for(int i=;i<=n;i++){
int id=upper_bound(sum+,sum++n,sum[i]-k)-sum;
while(sum[i]-sum[id-]>k) id++;
//cout<<id<<endl;
while(h<=t&&num[s[t]]<=num[i]) t--;
s[++t]=i;
while(h<=t&&s[h]<id) h++;
dp[i]=dp[id-]+num[s[h]];
for(int j=h+;j<=t;j++)
dp[i]=min(dp[i],dp[s[j-]]+num[s[j]]);
}
cout<<dp[n]<<endl;
}
这用一个递减的排列很明显可以卡成o(n^2)~~~~
POj3017 dp+单调队列优化的更多相关文章
- [poj3017] Cut the Sequence (DP + 单调队列优化 + 平衡树优化)
DP + 单调队列优化 + 平衡树 好题 Description Given an integer sequence { an } of length N, you are to cut the se ...
- 1023: [SHOI2008]cactus仙人掌图(DP+单调队列优化)
这道题吗= =首先解决了我多年以来对仙人掌图的疑问,原来这种高大上的东西原来是这个啊= = 然后,看到这种题,首先必须的就是缩点= = 缩点完之后呢,变成在树上找最长路了= =直接树形dp了 那么那些 ...
- Codeforces 1077F2 Pictures with Kittens (hard version)(DP+单调队列优化)
题目链接:Pictures with Kittens (hard version) 题意:给定n长度的数字序列ai,求从中选出x个满足任意k长度区间都至少有一个被选到的最大和. 题解:数据量5000, ...
- P3084 [USACO13OPEN]照片Photo (dp+单调队列优化)
题目链接:传送门 题目: 题目描述 Farmer John has decided to assemble a panoramic photo of a lineup of his N cows ( ...
- Codeforces 445A Boredom(DP+单调队列优化)
题目链接:http://codeforces.com/problemset/problem/455/A 题目大意:有n个数,每次可以选择删除一个值为x的数,然后值为x-1,x+1的数也都会被删除,你可 ...
- bzoj 1855 dp + 单调队列优化
思路:很容易写出dp方程,很容易看出能用单调队列优化.. #include<bits/stdc++.h> #define LL long long #define fi first #de ...
- 股票交易(DP+单调队列优化)
题目描述 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价为每股APi, ...
- Luogu 2627 修建草坪 (动态规划Dp + 单调队列优化)
题意: 已知一个序列 { a [ i ] } ,求取出从中若干不大于 KK 的区间,求这些区间和的最大值. 细节: 没有细节???感觉没有??? 分析: 听说有两种方法!!! 好吧实际上是等价的只是看 ...
- 【简洁易懂】CF372C Watching Fireworks is Fun dp + 单调队列优化 dp优化 ACM codeforces
题目大意 一条街道有$n$个区域. 从左到右编号为$1$到$n$. 相邻区域之间的距离为$1$. 在节日期间,有$m$次烟花要燃放. 第$i$次烟花燃放区域为$a_i$ ,幸福属性为$b_i$,时间为 ...
随机推荐
- 【2020-03-21】Dubbo本地环境搭建-实现服务注册和消费
前言 本周主题:加班工作.本周内忙于CRUD不能自拔,基本每天都是九点半下班,下周上线,明天还要加班推进进度.今天是休息日,于是重拾起了dubbo,打算近期深入了解一下其使用和原理.之所以说是重拾,是 ...
- DOTNET CORE源码分析之IOC容器结果获取内容补充
补充一下ServiceProvider的内容 可能上一篇文章DOTNET CORE源码分析之IServiceProvider.ServiceProvider.IServiceProviderEngin ...
- 我的MacbookPro进水了!维修过程记录
电脑进水与解决方案 如果事情有变坏的可能,不管这种可能性有多小,它总会发生.---墨菲定律 进水过程 2020年03月21日日下午3点左右,不小心把水杯碰倒了,水通过电脑右侧的键盘处进入了大概有10毫 ...
- C++ 人脸识别系统的浅理解
机器学习 机器学习的目的是把数据转换成信息. 机器学习通过从数据里提取规则或模式来把数据转成信息. 人脸识别 人脸识别通过级联分类器对特征的分级筛选来确定是否是人脸. 每个节点的正确识别率很高,但正确 ...
- Mysql常用sql语句(一)- 操作数据库
21篇测试必备的Mysql常用sql语句,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1683347.html ...
- 进制-Iterative-进制转换
2019-12-02 21:15:31 进制转换是计算机科学里的一个基础算法,通常可以使用如下的模版来进行计算. 下面我们来讨论一些关于进制的题目. 1271. Hexspeak 问题描述: 问题求 ...
- bluekeep漏洞(CVE-2019-0708)利用
前言 上个月爆出exp的一个高危漏洞,跟风复现一下下...( ̄▽ ̄)~* 简介 Windows再次被曝出一个破坏力巨大的高危远程漏洞CVE-2019-0708.攻击者一旦成功利用该漏洞,便可以在目标系 ...
- Python数据处理(持续更新)
#打开txt文件 #打开txt文件 with open('day02.txt') as f: for line in f.readlines(): aline=line.strip() bline=a ...
- 微信内置浏览器的JsAPI(WeixinJSBridge续)进入全屏
微信内置浏览器的JsAPI(WeixinJSBridge续)进入全屏 之前有写过几篇关于微信内置浏览器(WebView)中特有的Javascript API(Javascript Interface) ...
- TensorFlow 模型优化工具包 — 训练后整型量化
模型优化工具包是一套先进的技术工具包,可协助新手和高级开发者优化待部署和执行的机器学习模型.自推出该工具包以来, 我们一直努力降低机器学习模型量化的复杂性 (https://www.tensorfl ...