DP的优化途径---单调队列

1.前缀和+单调队列:https://www.acwing.com/problem/content/137/

我们先预处理下前缀和,以下标为i的点为有边界:

ans=max(ans,sum[i]-sum[j])(i-m\leqslant j\leqslant i-1)

也就是求sum[j](i-m\leqslant j\leqslant i-1)的min,考虑到j的范围是定值,用单调队列维护即可。

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node{int t;ll zhi;
};
int n,m;
ll a[300006];
ll sum[300006];
node q[300006];
int tail=-1,head=0;
int main(){cin>>n>>m;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i];ll ans=-1e18;for(int i=0;i<=n;i++){if(tail>=head&&(q[head].t<=i-m-1)) head++;if(tail>=head) ans=max(ans,sum[i]-q[head].zhi);while(tail>=head&&q[tail].zhi>=sum[i]) tail--;q[++tail]={i,sum[i]};}cout<<ans;}

2.DP+单调队列:https://www.acwing.com/problem/content/1089/

先维护出来前缀和,令dp[i]表示前i个的最大效率,答案就是dp[n]

我们考虑状态转移:

dp[i]=max(dp[i-1],max(sum[i]-sum[j]+dp[j-1])(i-k\leqslant j\leqslant i-1))

于是我们把dp值放入单调队列即可。

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;ll n,k;
ll a[100010],sum[100010],dp[100010];
ll q[100010],head=0,tail=-1;
int main(){cin>>n>>k;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i];dp[0]=a[0];q[++tail]=0;for(int i=1;i<=n;i++){while(tail>=head&&i-k>q[head]) head++;dp[i]=max(sum[i]+dp[q[head]-1]-sum[q[head]],dp[i-1]);ll xx=dp[i-1]-sum[i];while(tail>=head&&xx>dp[q[tail]-1]-sum[q[tail]]) tail--;q[++tail]=i;}cout<<dp[n];}

3.DP+单调队列:https://www.acwing.com/problem/content/1091/

令dp[i]表示前i个第i个一定选的最小花费:

dp[i]=a[i]+min(dp[j]),用单调队列维护。

AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[200010],dp[200010];
int q[200010],tail=-1,head=0;
int ans=0x7f7f7f7f;
int main(){cin>>n>>m;for(int i=1;i<=n;i++) cin>>a[i];q[++tail]=1;dp[1]=a[1];for(int i=2;i<=n;i++){while(tail>=head&&q[head]<i-m) head++;if(i<=m) dp[i]=a[i];else dp[i]=a[i]+dp[q[head]];while(tail>=head&&dp[i]<dp[q[tail]]) tail--;q[++tail]=i;}//for(int i=1;i<=n;i++) cout<<dp[i]<<" ";for(int i=n-m+1;i<=n;i++) ans=min(ans,dp[i]);cout<<ans;
}

4.二维的单调队列:https://www.acwing.com/problem/content/1093/

想到要维护出来每一个正方形的max与min,我们可以考虑先对行进行单调队列,求出行方向连续k个的最值,然后再对列进行一遍,这样就求出每一个正方行的最值了。

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int n, m, k, res = 1e9;
int w[N][N], minv[N][N], maxv[N][N], que[N];
int a[N], b[N], c[N], d[N];
void get_max(int a[], int f[], int m)
{int hh = 0, tt = -1;for (int i = 1; i <= m; i ++ ){while (hh <= tt && i - que[hh] >= k) hh ++ ;while (hh <= tt && a[i] >= a[que[tt]]) tt -- ;que[ ++ tt] = i;f[i] = a[que[hh]];}
}
void get_min(int a[], int f[], int m)
{int hh = 0, tt = -1;for (int i = 1; i <= m; i ++ ){while (hh <= tt && i - que[hh] >= k) hh ++ ;while (hh <= tt && a[i] <= a[que[tt]]) tt -- ;que[ ++ tt] = i;f[i] = a[que[hh]];}
}
int main()
{scanf("%d%d%d", &n, &m, &k);for (int i = 1; i <= n; i ++ )for (int j = 1; j <= m; j ++ )scanf("%d", &w[i][j]);for (int i = 1; i <= n; i ++ ){get_min(w[i], minv[i], m);get_max(w[i], maxv[i], m);}for (int i = k; i <= m; i ++ ){for (int j = 1; j <= n; j ++ ){a[j] = maxv[j][i];b[j] = minv[j][i];}get_max(a, c, n);get_min(b, d, n);for (int j = k; j <= n; j ++ ) res = min(res, c[j] - d[j]);}printf("%d\n", res);
}

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

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

相关文章

OpenGL3.3_C++_Windows(32)

demo SSAO SSAO 环境光照(Ambient Lighting)&#xff1a;光的散射&#xff0c;我们通过一个固定的常量作为环境光的模拟&#xff0c;但是这种固定的环境光并不能很好模拟散射&#xff0c;因为环境光不是一成不变的&#xff0c;环境光遮蔽&#xff1a;让&#xff08;褶皱、孔洞…

更新至2023年上市公司ESG数据合集(十份数据:华证年度、华证季度、商道融绿、wind、秩鼎、润灵环球、盟浪、富时罗素、上市银行华证ESG)

更新至2023年上市公司ESG数据合集&#xff08;十份数据&#xff1a;华证年度、华证季度、商道融绿、wind、秩鼎、润灵环球、盟浪、富时罗素、上市银行华证ESG&#xff09; 数据名称&#xff1a; 一、2018-2023年上市公司富时罗素ESG评分数据 二、2018-2023年上市公司Wind ES…

深度学习实战笔记3循环神经网络实现

我们要训练一个基于循环神经网络的字符级语言模型&#xff0c;根据用户提供的文本的前缀生成后续文本。 import math import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2l batch_size, num_steps 32, 35 train_iter, voc…

C#插件 调用存储过程(输出参数类型)

存储过程 CREATE PROCEDURE [dbo].[GetSum]num1 INT,num2 INT,result INT OUTPUT AS BEGINselect result num1 num2 END C#代码 using Kingdee.BOS; using Kingdee.BOS.App.Data; using Kingdee.BOS.Core.Bill.PlugIn; using Kingdee.BOS.Util; using System; using System.…

MySQL死锁问题案例

MySQL死锁问题 问题描述&#xff1a;在一张流水生成的记录表中&#xff0c;当没有当前条件的数据时候&#xff0c;并发情况下会导致有线程因为死锁问题生成流水号失败。 场景 有一张生成流水的表&#xff1a; 场景复现&#xff1a; 简单来说&#xff0c;在根据流水类型、年、月…

Python如何快速定位最慢的代码?优雅了~

编写Python代码时&#xff0c;我们常常会遇到性能瓶颈&#xff0c;这不仅影响程序的执行效率&#xff0c;还可能导致用户体验下降。那么&#xff0c;如何快速定位代码中最慢的部分&#xff0c;成为每个开发者必须掌握的技能。 如何快速定位 Python 代码中的性能瓶颈&#xff1…

Url图标实现

Url图标实现 效果如下&#xff1a; 1.引入样式 <link rel"icon" href"favicon.ico"> favicon.ico和对应的html一般需要在同一个目录下&#xff08;同级别&#xff09;。 2.title是用来设置在url页签中显示的名称。 可能存在的问题&#xff1a; …

前端实现文本超出指定行数显示”展开”和”收起”效果

目录 效果演示步骤一&#xff1a;实现整体框架步骤二&#xff1a;实现样式步骤三&#xff1a;js实现元素控制完整代码 效果演示 本文方法是利用js原生进行实现的&#xff0c;可根据相关vue或react语法进行相关的改写&#xff0c;并实现效果 步骤一&#xff1a;实现整体框架 <…

c-periphery RS485串口库文档serial.md(serial.h)(非阻塞读)(VMIN、VTIME)

c-peripheryhttps://github.com/vsergeev/c-periphery 文章目录 NAMESYNOPSISENUMERATIONS关于奇偶校验枚举类型 DESCRIPTIONserial_new()serial_open()关于流控制软件流控制&#xff08;XON/XOFF&#xff09;硬件流控制&#xff08;RTS/CTS&#xff09;选择流控制方法 serial_…

独立3D网络游戏《战域重甲》开发与上架经验分享

“ 小编阿麟&#xff1a;心之所向便是光&#xff0c;我们都是追光者!这位独立游戏开发者的产品能力已经不输给许多小团队&#xff0c;希望他的故事和经验分享&#xff0c;可以给走在同样道路上的朋友一些信心和帮助。 背景介绍 2023年年底的时候&#xff0c;我突然有一个很强的…

硬件工程师笔面试真题汇总

目录 1、电阻 1&#xff09;上拉电阻的作用 2&#xff09;PTC热敏电阻作为电源电路保险丝的工作原理 2、电容 1&#xff09;电容的特性 2) 电容的特性曲线 3) 1uf的电容通常来滤除什么频率的信号 3、电感 4、二极管 1&#xff09;二极管特性 2&#xff09;二极管伏安…

HVV | .NET 攻防工具库,值得您拥有!

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

《破解验证码:用Requests和Selenium实现模拟登录的终极指南》

两种模拟登录方式(图形验证码) 超级鹰 打码平台&#xff0c;用于识别验证码 requests模拟登录 from chaojiying import Chaojiying_Client import requests from requests import Session from lxml import etree #获取图片信息 def get_pic_info(img_name):chaojiying Ch…

10个append()函数在Python程序开发中的创新应用

文末赠免费精品编程资料~~ 在Python编程的世界里&#xff0c;append()函数是列表操作中最常见的方法之一。它允许我们在列表的末尾添加一个元素&#xff0c;这一简单的功能却能激发无限的创造力。今天&#xff0c;我们将探讨append()函数在Python程序开发中的10种创新应用&…

代码随想录第23天|回溯

39.组合总和 题目链接/文章讲解&#xff1a; 代码随想录 视频讲解&#xff1a;带你学透回溯算法-组合总和&#xff08;对应「leetcode」力扣题目&#xff1a;39.组合总和&#xff09;| 回溯法精讲&#xff01;_哔哩哔哩_bilibili 第一想法&#xff1a; 组合总和与第22天组合总…

爬虫实战-掌上高考网实战

1.确定需求&#xff1a;爬取什么数据爬取大学名称 2.找到数据源地址数据在哪个链接中https://api.zjzw.cn/web/api/?keyword&page1&province_id&ranktype&request_type1&size20&top_school_id[3703,2461,659,3117,597,1724]&type&uriapidata/…

2024电赛H题参考方案——自动行使小车

目录 一、题目要求 二、参考资源获取 三、参考方案 1、环境搭建及工程移植 2、移植MPU6050模块 3、移植TB6612电机驱动模块 其他模块根据需要移植 总结 一、题目要求 小编自认为&#xff1a;此次H题属于控制类题目&#xff0c;相较于往年较为简单&#xff0c;功能也算单一&…

【Java】韩顺平Java学习笔记 第19章 IO流

文章目录 文件概述常用的文件操作创建文件获取文件信息目录的操作和文件删除流的分类各抽象类常用子类对象FileInputStreamFileOutputStreamFileReaderFileWriter 节点流和处理流概念BufferedReaderBufferedWriterBufferedInputStream & BufferedOutputStream 对象流&#…

Python | TypeError: ‘module’ object is not callable

Python | TypeError: ‘module’ object is not callable 在Python编程中&#xff0c;遇到“TypeError: ‘module’ object is not callable”这类错误通常表明你尝试像函数一样调用了一个模块。这种错误通常是由于导入模块时的疏忽或误解导致的。本文将深入探讨此错误的根源&…

2024年7月23日~2024年7月29日周报

目录 一、前言 二、完成情况 2.1 一种具有边缘增强特点的医学图像分割网络 2.2 融合边缘增强注意力机制和 U-Net 网络的医学图像分割 2.3 遇到的困难 三、下周计划 一、前言 上周参加了一些师兄师姐的论文讨论会议&#xff0c;并完成了初稿。 本周继续修改论文&#xff0…