Slastičarnica:非常好的区间 dp 题。

暴力

不难设计出暴力状态:\(dp_{q,i,j}\) 表示进行到第 \(q\) 次操作,剩下区间 \([i,j]\) 是否可行。

直到全部状态都为 \(0\) 的时候输出即可。

期望得分 \(19pts\)。

优化(假)

观察到每个 \(dp\) 状态都只有两个值 \(0,1\),那么我们可以考虑将状态中的某一维放进 \(dp\) 值里。

首先尝试把 \(q\) 换进去,状态设计为 \(dp_{i,j}\) 为剩余区间 \([i,j]\) 时进行的最大操作数为 \(q\)。

那么我们怎么转移?从大往小枚举区间,然后根据当前进行的操作,每次查询满足要求的前缀后缀,转移一下即可。

此时我们不难发现,\(q\) 的最大值只能是 \(n\),根本无法取到更大。这就是这题的诈骗点。

时间复杂度是 \(O(n^3)\) 的,而我们可以发现无法继续优化下去(四边形不等式等都用不了),就要换一种思路。

贪心

显然,对于一段区间而言,长度越长,自然是对答案更优。为什么?因为每次操作都可以留出更多的空间来操作。

于是我们考虑固定左端点,把右端点换出来。

正解

设计状态 \(dp_{q,i}\) 表示进行到了第 \(q\) 次操作,左端点为 \(i\) 时的最大右端点在哪。

每次操作可以选前缀、后缀,于是我们分两种转移。

前缀

\(dp_{q,i}\) 能转移当且仅当 \([i-d,i-1]\) 能被消掉,然后转移左端点在 \(i\) 前面的 \(j\) 的所有 \(dp_{q-1,j}\) 的值。

这个可以做一个很显然的前缀和优化,不再细说。

后缀

感觉这个比较难搞。

\(dp_{q,i}\) 能转移的条件是在 \([j,dp_{q-1,j}]\) 中有能消除的后缀,同时在这些后缀中取最大的左端点转移。

观察到 \(dp_{q-1,j}\) 也在 \([1,n]\) 之间,于是我们可以预处理出对于每一个点,在他左边的最大可消除后缀的左端点在哪,这个可以 \(O(n)\) 处理出。

然后每次转移一下即可。

总体时间复杂度 \(O(\min(n,q)n)\)。

细节

特判整个序列被删完的情况。只需要在删后缀里面加特判即可。因为要删完肯定是一次删全部,那么此时就没有前缀后缀之分了,算哪个都可以。

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc ((p<<1)|1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pi;
int n,q,a[5005],mn[5005][5005],dp[5005][5005],rmx[5005];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>q;
for(int i=1;i<=n;i++)cin>>a[i];
memset(mn,0x3f,sizeof(mn));
for(int i=1;i<=n;i++)
{
mn[i][i]=a[i];
for(int j=i+1;j<=n;j++)mn[i][j]=min(mn[i][j-1],a[j]);
}
memset(dp,-1,sizeof(dp));
dp[0][1]=n;
for(int i=1;i<=min(n,q);i++)
{
bool ed=1;
int d,s,pre=-1,p=-1;
cin>>d>>s;
for(int j=1;j<=n;j++)
{
if(j-d>=1)pre=max(pre,dp[i-1][j-d]);
if(j-d>=1&&mn[j-d][j-1]>=s)dp[i][j]=max(dp[i][j],pre);
}
for(int j=1;j<=n;j++)
{
if(j-d+1>=1&&mn[j-d+1][j]>=s)p=max(p,j-d+1);
rmx[j]=p;
}
for(int j=1;j<=n;j++)
{
if(rmx[dp[i-1][j]]-1>=j)dp[i][j]=max(dp[i][j],rmx[dp[i-1][j]]-1);
if(dp[i][j]<j)dp[i][j]=-1;
if(rmx[dp[i-1][j]]==j)ed=0;
}
for(int j=1;j<=n;j++)if(dp[i][j]!=-1)ed=0;
if(ed)
{
cout<<i-1;
return 0;
}
}
cout<<q;
return 0;
}

Luogu P9180 [COCI2022-2023#5] Slastičarnica 题解 [ 蓝 ] [ 区间 dp ] [ dp 状态优化 ] [ 前缀和优化 ]的更多相关文章

  1. luogu P1549 棋盘问题(2) 题解

    luogu P1549 棋盘问题(2) 题解 题目描述 在\(N * N\)的棋盘上\((1≤N≤10)\),填入\(1,2,-,N^2\)共\(N^2\)个数,使得任意两个相邻的数之和为素数. 例如 ...

  2. 【luogu P1314 聪明的质监员】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1314 二分答案 但是计算区间贡献的时候 直接暴力会挂 前缀和加速 #include <cstdio&g ...

  3. BZOJ 2023 [Usaco2005 Nov]Ant Counting 数蚂蚁:dp【前缀和优化】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2023 题意: 有n个家族,共m只蚂蚁(n <= 1000, m <= 1000 ...

  4. 题解——洛谷P2734 游戏A Game 题解(区间DP)

    题面 题目背景 有如下一个双人游戏:N(2 <= N <= 100)个正整数的序列放在一个游戏平台上,游戏由玩家1开始,两人轮流从序列的任意一端取一个数,取数后该数字被去掉并累加到本玩家的 ...

  5. 【题解】POJ1934 Trip (DP+记录方案)

    [题解]POJ1934 Trip (DP+记录方案) 题意: 传送门 刚开始我是这么设状态的(谁叫我DP没学好) \(dp(i,j)\)表示钦定选择\(i\)和\(j\)的LCS,然而你会发现这样钦定 ...

  6. 【题解】剪纸条(dp)

    [题解]剪纸条(dp) HRBUST - 1828 网上搜不到题解?那我就来写一篇吧哈哈哈 最优化问题先考虑\(dp\),设\(dp(i)\)表示将前\(i\)个字符(包括\(i\))分割成不相交的回 ...

  7. 【题解】ARC101F Robots and Exits(DP转格路+树状数组优化DP)

    [题解]ARC101F Robots and Exits(DP转格路+树状数组优化DP) 先删去所有只能进入一个洞的机器人,这对答案没有贡献 考虑一个机器人只能进入两个洞,且真正的限制条件是操作的前缀 ...

  8. 【题解】地精部落(DP)

    [题解]地精部落(DP) 设\(f_i\)表示强制第一个是谷的合法方案数 转移枚举一个排列的最大值在哪里,就把序列分成了互不相干的两个部分,把其中\(i-1\choose j-1\)的数字分配给前面部 ...

  9. 【luogu P2279 [HNOI2003]消防局的设立】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2279 想怎么贪怎么贪 #include <queue> #include <cstdio& ...

  10. 【luogu P2762 太空飞行计划问题】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2762 算是拍照那个题的加强下. 输入真的很毒瘤.(都这么说但好像我的过了?) #include <qu ...

随机推荐

  1. vue3 父子组件传值

    父传子组件 <template> <div> <!-- 通过自定义属性传递值 --> <Subassembly :value="doc"/ ...

  2. 远程连接利器:玩转MobaXterm

    今天这篇文章轻松不烧脑,主要是想和大家分享一下我在工作中常用的远程管理工具--MobaXterm.这款工具不仅功能强大,而且在日常的远程操作中极为高效,特别适合用来管理远程服务器.MobaXterm结 ...

  3. windows server系统中,Pro运行深度学习工具错误

    安装深度学习包后,运行相关工具的时候报错,缺失cv2的模块. 在arcpy执行窗口,直接去引入cv2包的时候,确实发了错误. 查看了相关路径,确认cv2的包,在对应路径已经存在,也有对应的元数据信息, ...

  4. PictureMarkerSymbol透明的问题

    由于我使用的是位图图片,所以不可能将图片背景处理成透明.不过还是可以通过参数的设定来达到这种效果. PictureMarkerSymbol pPMS = new PictureMarkerSymbol ...

  5. mysql5.7配置文件详解

    8核心32G独立mysql服务器的配置文件如下: [client] port = 3306 socket = /data/mysql/mysql.sock [mysql] prompt = " ...

  6. Spring Security并结合JWT实现用户认证(Authentication) 和用户授权(Authorization)

    引言在Web应用开发中,安全一直是非常重要的一个方面.Spring Security基于Spring 框架,提供了一套Web应用安全性的完整解决方案. JwT (JSON Web Token) 是当前 ...

  7. Spring Validation 校验

    概述 在 Web 应用中,客户端提交数据之前都会进行数据的校验,比如用户注册时填写的邮箱地址是否符合规范.用户名长度的限制等等,不过这并不意味着服务端的代码可以免去数据验证的工作,用户也可能使用 HT ...

  8. springboot拦截器过滤token,并返回结果及异常处理

    package com.xxxx.interceptor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sp ...

  9. 【转】ReentrantReadWriteLock读写锁详解

    https://www.cnblogs.com/xiaoxi/p/9140541.html 一.读写锁简介 现实中有这样一种场景:对共享资源有读和写的操作,且写操作没有读操作那么频繁.在没有写操作的时 ...

  10. TB交易开拓者_趋势跟踪策略_多品种对冲_递进优化回测_A0001188020期货量化策略

    如果您需要代写技术指标公式, 请联系我. 龙哥QQ:591438821 龙哥微信:Long622889 也可以把您的通达信,文华技术指标改成TB交易开拓者的自动交易量化策略. 众所周知,投资界有基本面 ...