bzoj1233 单调队列优化dp

https://www.lydsy.com/JudgeOnline/problem.php?id=1233

数据结构优化dp的代码总是那么抽象

题意:奶牛们讨厌黑暗。 为了调整牛棚顶的电灯的亮度,Bessie必须建一座干草堆使得她能够爬上去够到灯泡 。一共有N大包的干草(1<=N<=100000)(从1到N编号)依靠传送带连续的传输进牛棚来。第i包干草有一个 宽度W_i(1<=w_i<=10000)。所有的干草包的厚度和高度都为1. Bessie必须利用所有N包干草来建立起干草堆,并且按照他们进牛棚的顺序摆放。她可以相放多少包就放 多少包来建立起tower的地基(当然是紧紧的放在一行中)。接下来他可以放置下一个草包放在之前一级 的上方来建立新的一级。注意:每一级不能比下面的一级宽。她持续的这么放置,直到所有的草包都被安 置完成。她必须按顺序堆放,按照草包进入牛棚的顺序。说得更清楚一些:一旦她将一个草包放在第二级 ,她不能将接下来的草包放在地基上。 Bessie的目标是建立起最高的草包堆。

Input

第1行:一个单一的整数N。 第2~N+1行:一个单一的整数:W_i。

 

奥妙重重dp题。

第一眼觉得是个反向贪心,从上往下取,每次取最小的可以形成下一层的干草集合,后来发现是个假算法。

反例 


6 2 3 7 10 11

既然贪心不行,就自然而然想到dp,考虑dp[i]表示到这一层的最大层数,发现不可行,因为这样的dp方法不能固定一个状态。

但是这一题有一个很强的证明:对于一座干草堆而言,基底最小的状态一定为最优状态。

也就是说,每一个状态中,地基最小的状态就是高度最高的状态,我们可以简单的推断一下,每一个高度最高的状态必然可以从下往上贪心的堆干草最终达到基底最小的状态。

这样我们原来的dp就变成了dp[i]表示i -- n种所有干草组成的集合形成的最小的干草堆的基底。

我们反向从N - > 1遍历,对于i,需要找到一个最小的大于i的j满足 sum[j - 1] - sum[i - 1] >= dp[j], 这样就变成了一个O(N * N)的dp,但是这还不够,到这一步需要考虑优化。

我们将转移方程变形 变成sum[i - 1] <= sum[j - 1] - dp[j],注意到我们每次需要的考虑的集合在每一次询问i的时候都多加入1个,以及当存在k < j && sum[k - 1] - dp[k]  >= sum[j - 1] - dp[j]的时候,j就是一个多余的状态,sum[i - 1]由于其前缀和的性质,事实上是递减的,对于每一次集合内的查找,我们在查找到最小的j的时候,可以将其余的比sum[i - 1]大的状态全部舍弃。

以上三个性质中,显然可以发现用来维护这个集合的数据结构就是单调队列,最终时间复杂度O(n)

#include <map>
#include <set>
#include <ctime>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
#define For(i, x, y) for(int i=x;i<=y;i++)  
#define _For(i, x, y) for(int i=x;i>=y;i--)
#define Mem(f, x) memset(f,x,sizeof(f))  
#define Sca(x) scanf("%d", &x)
#define Sca2(x,y) scanf("%d%d",&x,&y)
#define Scl(x) scanf("%lld",&x);  
#define Pri(x) printf("%d\n", x)
#define Prl(x) printf("%lld\n",x);  
#define CLR(u) for(int i=0;i<=N;i++)u[i].clear();
#define LL long long
#define ULL unsigned long long  
#define mp make_pair
#define PII pair<int,int>
#define PIL pair<int,long long>
#define PLL pair<long long,long long>
#define pb push_back
#define fi first
#define se second 
typedef vector<int> VI;
const double eps = 1e-9;
const int maxn = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7; 
int N,M,tmp,K; 
int a[maxn];
int sum[maxn];
int dp[maxn];
int f[maxn];
int Queue[maxn];
int main()
{int N; Sca(N);  //sum[i - 1] <= sum[j - 1] - dp[j]For(i,1,N){Sca(a[i]);sum[i] = sum[i - 1] + a[i];} int head = 1,tail = 1; Queue[1] = N + 1;_For(i,N,1){while(head < tail && sum[i - 1] <= sum[Queue[head + 1] - 1] - dp[Queue[head + 1]]) head++;dp[i] = sum[Queue[head] - 1] - sum[i - 1];f[i] = f[Queue[head]] + 1;while(head <= tail && sum[i - 1] - dp[i] >= sum[Queue[tail] - 1] - dp[Queue[tail]]) tail--;Queue[++tail] = i;}printf("%d",f[1]);#ifdef VSCodesystem("pause");#endifreturn 0;
}

 

转载于:https://www.cnblogs.com/Hugh-Locke/p/9671948.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464947.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Win10系统添加 Win10 LTSC2019闹钟

1、本文主要针对没有windows闹钟的情况。 2、下载Win10 LTSC 2019闹钟应用&#xff0c;并解压&#xff1a; http://www.winwin7.com/soft/xtbd-2695.html 链接&#xff1a;https://pan.baidu.com/s/1S_g6XUIezeF8_Q0rJ09cBQ 提取码&#xff1a;68gs 3、搜索Windows Powershell&…

iPhone开发笔记[1/50]:初学iPhone上用Quartz 2D画图

参考了An iOS 4 iPhone Graphics Drawing Tutorial using Quartz 2D这篇文章&#xff0c;用了30分钟在iPhone上画出了一条直线&#xff0c;核心代码全在drawRect这个方法中&#xff1a; -(void)drawRect:(CGRect)rect { CGContextRef context UIGraphicsGetCurrentContext(); C…

MDK中利用宏定义__DATE__和__TIME__设置产品的代码固件版本

文章目录前言一、__DATE__和__TIME__是什么&#xff1f;二、使用步骤1.引入库2.参考代码总结前言 STM32开发中&#xff0c;利用宏定义的__DATE__和__TIME__设置产品的代码固件版本&#xff1a; 为了方便在编译代码的时候&#xff0c;自动生成代码固件的版本号&#xff0c;所以…

昨晚上跟读者闲聊

昨天发了一篇华为小米的求职文章&#xff0c;今天一个知识星球的朋友找我聊天&#xff0c;也是关于择业的问题。本来是聊找工作的&#xff0c;然后聊着聊着就聊到了生活的一些事情。我平时比较关注微信信息&#xff0c;有重要能回复就会回复&#xff0c;但是&#xff0c;也不喜…

上次作业的升级版

好好好 211606375 牛振乾 211606351 曾茜 一、预估与实际 PSP2.1Personal Software Process Stages预估耗时&#xff08;分钟&#xff09;实际耗时&#xff08;分钟&#xff09;Planning计划• Estimate• 估计这个任务需要多少时间4040Development开发9001000• Analysis• 需…

学习vim的正确姿势!

有很多种方法可以去学习Vim&#xff1a;vimtutor就是一个很棒的教程&#xff0c;另外还有help拥有您所想的所有参考信息。链接:https://github.com/wsdjeg/Learn-Vim_zh_cn但是在日常使用中&#xff0c;对于绝大部分用户的需求而言&#xff0c;vimtutor讲得太浅不能满足需要&am…

什么是自由软件?

来源 | www.gnu.org编排 | strongerHuang可能你认为免费软件&#xff0c;就是自由软件&#xff0c;那么你肯定错了&#xff0c;下面来听听专家怎么描述自由软件的。strongerHuang1自由软件定义开源&#xff08;Open source&#xff09;是另外一回事&#xff1a;它有基于不同价值…

输入框设置只能输入数字

HTML5 可以用&#xff1a;<input type"number">html4 的话只能用js实现了&#xff1a;<input type"text" οnkeyup"this.valuethis.value.replace(/\D/g, )">上面的只能输入整数。如果需要小数正则需要改成&#xff1a;/[^\d\.]/g再…

毕业设计| STM32F103全彩FFT音乐频谱+LED年历闹钟显示

大家好&#xff0c;我是写代码的篮球球痴&#xff0c;今天在后台看到有人想找毕业设计的点子。然后我今天刚好看到一个不错的点子&#xff0c;给大家分享看今天分享的毕设是来自点-凡自制的FTF音乐频谱制作&#xff0c;先来看展示效果&#xff1a;——视频出处&#xff1a;B站点…

VScode 开发stm32无法识别uint32_t,uint16_t,uint8_t问题

1、添加头文件#include “stdint.h”。 2、在c_cpp_properties.json文件中添加__CC_ARM即可。如下图&#xff1a;

动画讲解C语言的指针,从未如此简单

推荐阅读&#xff1a;专辑|Linux文章汇总专辑|程序人生专辑|C语言我的知识小密圈关注公众号&#xff0c;后台回复「1024」获取学习资料网盘链接。欢迎点赞&#xff0c;关注&#xff0c;转发&#xff0c;在看&#xff0c;您的每一次鼓励&#xff0c;我都将铭记于心~

SQL Activity Monitor

从实质上说, Actvity Monitor不过是SQL Server中系统View sys.sysprocesses的一种展现. SP_Who2应该也是从这里查询到的数据。下面是view sysprocesses的SELECT内容&#xff1a; SELECT spid, kpid, blocked, waittype, waittime, lastwaittype, waitresource, dbid, …

毕业这几年的嵌入式开发之路

大家好&#xff0c;我是写代码的篮球球痴今天分享一篇文章&#xff0c;这篇文章的主人公总结了他这些年来的嵌入式之路&#xff0c;希望对大家的职业规划有所帮助。在毕业即失业的年代&#xff0c;来看一位朋友是如何玩转嵌入式开发的&#xff0c;献给迷惘的你。出师不利本科毕…

修改Win10 alt+F4默认选项为关机

1、winr打开路径计算机\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced&#xff0c;当前目录下新建DWORD(32位)文件&#xff0c;命名为“Start_PowerButtonAction”。设置值为2&#xff08;16进制&#xff09;。 2、重启电脑。altF4默认为“关…

p1968

我觉得这个评测机和我有仇,写了readgetchar都会超时这么多,最后好像是ios::sync_with_stdio(false);惹的祸... 昨天想找一些水题来写,就看到了这个模拟"水题",想了一下午都不知道怎么搞. 已知一些牛的颜色和位置,求连续相同颜色或连续两种颜色数量相同的区间右端点位…

免费!200块全志XR806开源鸿蒙开发板试用

一板难求的当下&#xff0c;如果上天突然降临一次开发板免费用的活动&#xff0c;我只想说三个字&#xff1a;手慢无&#xff01;为了让开发者小哥哥小姐姐们体验搭载安谋科技STAR-MC1处理器&#xff0c;面向IoT领域的全志XR806开发板&#xff0c;极术社区特推出2022年新年活动…

你们还留恋windows什么呢?

为什么80%的码农都做不了架构师&#xff1f;>>> 我最近看到一个报道&#xff0c;节录如下&#xff1a; --------------------------------------------- ARM全球总裁Tudor Brown 5月3日表示&#xff0c;预期2015年全球移动PC总量就会达到7.5亿台以上&#xff0c; …

MDK调试:设置断点处,代码运行的次数

https://www.cnblogs.com/ramlife/articles/14024516.html

卓老师的这些动图对电子理解真的很有用

01 串行通信在头条电子森林博客中看到一些显示电子系统中信号波形的动图&#xff0c;有助于帮助我们理解传输的机理。特转载如下。1、SPI传输▲ 图1 SPI 数据传输▲ 图1.2 SPI数据传输&#xff08;2&#xff09;▲ 图1.3 SPI时序信号2、I2C传输▲ 图1.2.1 I2C总线以及寻址方…

国内网络安全公司、社区简介

国内网络安全公司简介<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />1&#xff0e;http://www.symantec.com/region/cn赛门铁克中国一家从事网络安全服务的公司&#xff0c;挺供网络安全产品下载、整体网络安全解决方案。2&…