删好串(区间dp)

problem

定义长度为 nnn 的“好”的串 aaa 满足:

  • ∣ai−ai−1∣=1,i∈[2,n]|a_i-a_{i-1}|=1,i\in[2,n]aiai1=1,i[2,n]
  • ai≥ai−1+ai+12,i∈[2,n−1]a_i\ge \frac{a_{i-1}+a_{i+1}}{2},i\in[2,n-1]ai2ai1+ai+1,i[2,n1]

给定长度为 nnn 的序列 a,va,va,v,每次选择一段 aaa 的“好”子串删除,剩下的子串拼接在一起。

若删除子串长度为 xxx,则会获得 vxv_xvx 的价值。

不一定要删完,求最大价值。

n≤400,∣vi∣≤1e5,1≤ai≤1e9n\le 400,|v_i|\le 1e5,1\le a_i\le 1e9n400,vi1e5,1ai1e9

solution

observation:子串要么是单增,要么是单减,要么是先单增后单减,即/\/\。显然 \/ 情况下的最低点无法满足条件 222

先不考虑“不一定全删完”,我们就要求必须删完。

fl,r:[l,r]f_{l,r}:[l,r]fl,r:[l,r] 全部删完的最大价值。显然是区间 dpdpdp 转移。(dpdpdp 转移就是要归到子问题上)

  • 考虑最后一次删除 l,rl,rl,r 不是一起被删的,那么肯定存在一个中间点 ppp 分割这段区间。

    fl,r←fl,p+fp+1,rf_{l,r}\leftarrow f_{l,p}+f_{p+1,r}fl,rfl,p+fp+1,r

  • 考虑最后一次删除 l,rl,rl,r 是一起被删的。

    那么我们就需要知道最后一次的单增/单减序列的价值。

    gl,r:[l,r]g_{l,r}:[l,r]gl,r:[l,r] 删到只剩一个单增序列的最大价值。

    hl,r:[l,r]h_{l,r}:[l,r]hl,r:[l,r] 删到只剩一个单减序列的最大价值。

    我们直接枚举两个序列的交点,即最高点 iii

    fl,r←gl,i+hi,r+v(ai∗2−al−ar+1)f_{l,r}\leftarrow g_{l,i}+h_{i,r}+v(a_i*2-a_l-a_r+1)fl,rgl,i+hi,r+v(ai2alar+1)

    当然还有只有单增/单减情况,但要求 al,ara_l,a_ral,ar 满足相应大小关系。

    fl,r←gl,r+v(ar−al+1)al≤arf_{l,r}\leftarrow g_{l,r}+v(a_r-a_l+1)\quad a_l\le a_rfl,rgl,r+v(aral+1)alar

    fl,r←hl,r+v(al−ar+1)al≥arf_{l,r}\leftarrow h_{l,r}+v(a_l-a_r+1)\quad a_l\ge a_rfl,rhl,r+v(alar+1)alar

    至于 g,hg,hg,h 的转移,同样枚举接在 rrr 前的元素 iii,即可变成子问题。

    gl,r←gl,i+fi+1,r−1ai+1=arg_{l,r}\leftarrow g_{l,i}+f_{i+1,r-1}\quad a_i+1=a_rgl,rgl,i+fi+1,r1ai+1=ar

    hl,r←hl,i+fi+1,r−1ai−1=arh_{l,r}\leftarrow h_{l,i}+f_{i+1,r-1}\quad a_i-1=a_rhl,rhl,i+fi+1,r1ai1=ar

最后再来个 dpi:[1,i]dp_i:[1,i]dpi:[1,i] 一定删掉 [k,i][k,i][k,i] 连续一段,但前面不要求删完的最大价值。

枚举 jjjdpj+fk,i→dpidp_j+f_{k,i}\rightarrow dp_idpj+fk,idpi,前缀最大值优化,转移,dpndp_ndpn 就是最后的结果了。

时间复杂度 O(n3)O(n^3)O(n3)

code

#include <bits/stdc++.h>
using namespace std;
#define maxn 405
#define int long long
#define inf 0x3f3f3f3f
int n;
int v[maxn], a[maxn], dp[maxn];
int f[maxn][maxn], g[maxn][maxn], h[maxn][maxn];signed main() {freopen( "good.in", "r", stdin );freopen( "good.out", "w", stdout );scanf( "%lld", &n );for( int i = 1;i <= n;i ++ ) scanf( "%lld", &v[i] );for( int i = 1;i <= n;i ++ ) scanf( "%lld", &a[i] );//f[l][r]:删完[l,r]的最大价值for( int l = n;l;l -- )for( int r = l;r <= n;r ++ ) {f[l][r] = g[l][r] = h[l][r] = -inf;g[l][l] = h[l][l] = 0;for( int i = l;i <= r;i ++ ) {f[l][r] = max( f[l][r], f[l][i] + f[i + 1][r] );//case1 枚举断点if( a[i] - 1 == a[r] ) h[l][r] = max( h[l][r], h[l][i] + f[i + 1][r - 1] );//h[l][r]:将[l,r]删到只剩一个下坡的最大价值 且l,r一定不被删if( a[i] + 1 == a[r] ) g[l][r] = max( g[l][r], g[l][i] + f[i + 1][r - 1] );//g[l][r]:将[l,r]删到只剩一个上坡的最大价值 且l,r一定不被删if( a[l] <= a[i] and a[i] >= a[r] ) f[l][r] = max( f[l][r], g[l][i] + h[i][r] + v[(a[i] << 1) - a[l] - a[r] + 1] );//case2 枚举最高点/连接点}if( a[l] <= a[r] ) f[l][r] = max( f[l][r], g[l][r] + v[a[r] - a[l] + 1] );//case3直接一个递增序列无凸点if( a[l] >= a[r] ) f[l][r] = max( f[l][r], h[l][r] + v[a[l] - a[r] + 1] );//case4直接一个递减序列无凸点}for( int i = 1;i <= n;i ++ ) {dp[i] = max( dp[i], dp[i - 1] );for( int j = i;j <= n;j ++ ) dp[j] = max( dp[j], dp[i - 1] + f[i][j] );//枚举删去[l,r]一段并加上前面剩下的最大值(利用前缀最大值优化dp)}printf( "%lld\n", dp[n] );return 0;   
}

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

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

相关文章

直播预告 - 微软MVP为你揭秘Visual Studio 2019新特性

作为"宇宙第一IDE“的Visual Studio集成开发环境&#xff0c;已经经历了超过十几年的迭代成为一款功能丰富且高效的开发工具&#xff0c;微软自己给Visual Studio 的定位是 “更快、更可靠&#xff0c;对个人和团队更具生产力&#xff0c;更易于使用&#xff0c;并且更容易…

Delete Edges

Delete Edges 题意&#xff1a; 给出一个n个点的完全图&#xff0c;删一些三元环使得边数<n 输出所删的三元环 3<n<2000 题解&#xff1a; 肯定是结论题&#xff0c;但是我不会。。 结论&#xff1a;xyz0(mod n)1<x<y<z<n所有解即可 证明过程可以看看…

.NET 机器学习生态调查

机器学习是一种允许计算机使用现有数据预测未来行为、结果和趋势的数据科学方法。 使用机器学习&#xff0c;计算机可以在未显式编程的情况下进行学习。机器学习的预测可以使得应用和设备更智能。 在线购物时&#xff0c;机器学习基于历史购买推荐你可能喜欢的其他产品。 刷信用…

图中异色点对最短距离(最小生成树+线段树)

problem 给定一个 nnn 个点&#xff0c;mmm 条边的无向连通图&#xff0c;图有边权&#xff0c;每个点有一个颜色。 有 qqq 次操作&#xff0c;每次操作可更改某一个点颜色。 求每次操作后图中不同颜色点之间的最短距离。 若图中点颜色全相同&#xff0c;输出 000。 一行给…

Defend Your Country

Defend Your Country 题意&#xff1a; n个点&#xff0c;m条边的简单无向连通图&#xff0c;每个点一个权值ai,一个连通块的贡献&#xff1a;(−1)块内点数∗∑ai[点i在该连通块内](-1)^{块内点数}*\sum a_{i}[点i在该连通块内](−1)块内点数∗∑ai​[点i在该连通块内] 可以…

SkyWalking Liunx 环境搭建NetCore接入

背景前两天看见有小哥介绍windows下安装skywalking的介绍地址。正好最近也在搭建linux环境的SkyWalking&#xff0c;顺便把linux环境搭建的经验分享下&#xff0c;帮助下使用linux部署DotNetCore项目的同学。介绍SkyWalking是开源的apm工具&#xff0c;服务器端使用java编写&am…

AtCoder 2305 [AGC010D] Decrementing(博弈)

problem Luogu链接 solution case1&#xff1a;aaa 中如果有 111 的存在&#xff0c;那么相当于第二步失效&#xff0c;最后的结果仅由 ∑ai−1\sum a_i-1∑ai​−1 的奇偶性决定&#xff08;奇数先手赢&#xff0c;偶数后手赢&#xff09; 奇数先手赢&#xff0c;偶数后手…

P4568 [JLOI2011]飞行路线

P4568 [JLOI2011]飞行路线 题意&#xff1a; n个城市&#xff0c;m个航班&#xff0c;你有k次免费坐航班的机会&#xff0c;问从s到t最少花费是多少&#xff1f; 题解&#xff1a; 分层图问题 简单说说什么是分层图&#xff1a; 其实就是将一个平面的图重新建图&#xff0c…

.NET 基金会完成第一次全面改选

.NET基金会是一个独立的组织&#xff0c;支持.NET社区和开源&#xff0c;旨在拓宽和加强.NET生态系统和社区。这可以通过多种方式完成&#xff0c;包括项目指导&#xff0c;指导&#xff0c;法律和营销帮助&#xff0c;技术和财务支持设置等&#xff0c;2014年微软组织成立.NET…

一般图带权多重匹配(欧拉图+最小费用流)

problem 给定 nnn 个数 {ai}\{a_i\}{ai​}&#xff0c;其中 kkk 个 aia_iai​ 是奇数&#xff0c;再给一个 nnn\times nnn 的矩阵 {ci,j}\{c_{i,j}\}{ci,j​}&#xff0c;无论是 aaa 还是 ccc&#xff0c;都保证是非负整数。 现在可以做一类操作&#xff1a;将 ai−1,aj−1a_…

xay loves trees

xay loves trees 题意&#xff1a; 有两棵树&#xff0c;现在让你找到一个最大的点集合S&#xff0c;要求S中的点在第一棵树中任意两点存在祖先儿子关系且所有点是连接的&#xff0c;在第二棵树中任意两点都不存在祖先儿子关系&#xff0c;问S集合的最大是多少&#xff1f; …

特来电混沌工程实践

一、导语随着大型分布式系统架构的演进和广泛应用&#xff0c;软件工程的最佳实践也随之改变。我们通过分布式、服务化、DevOps、敏捷开发&#xff0c;快速响应业务的需求变化&#xff0c;支持大规模分布式应用。但这些做法带来效益的同时&#xff0c;也带来了另一个紧迫问题&a…

[ZJOI2007] 棋盘制作(单调栈 / DP悬线法)

problem 洛谷链接 solution1-单调栈 很容易想到&#xff0c;预处理出每个点向上最大能延伸的长度&#xff0c;然后对每个点求一个矩阵面积。 然后思考优化&#xff0c;不难想到每次对一行进行求解。 每一行的所有列一起构成了一个直方图。 直方图直接经典笛卡尔树。笛卡尔…

P2567 [SCOI2010]幸运数字

P2567 [SCOI2010]幸运数字 题意&#xff1a; 我们规定只含6或8的数字为幸运号码&#xff0c;而幸运号码的倍数我们也认为是幸运号码&#xff0c;问[l,r]中有多少个幸运号码&#xff1f; 题解&#xff1a; 第一反应是数位dp&#xff0c;但其实不是&#xff0c;我们可以打表观…

构建现代Web应用时究竟是选择传统web应用还是SPA

在大前端盛行的今天&#xff0c;似乎前后端分离的开发模式才是大势所趋&#xff0c;而SPA的概念更是应运而生。现在随便构建一个web应用程序如果你不是使用SPA的话&#xff0c;就会感觉有点low&#xff0c;但是真的是这样吗&#xff1f;今天这篇文章我们就来一起探讨下&#xf…

[ZJOI2007] 时态同步(拓扑序)

problem 洛谷链接 solution 结论&#xff1a;使用道具的导线深度越浅越好。 显然&#xff0c;如果有两个终止节点都需要增加 xxx&#xff0c;那么在他们的 lca\text{lca}lca 到根的路径中任意一条边增加 xxx 即可&#xff0c;各自增加 xxx 显然不优。 所以我们不妨倒过来&…

P2571 [SCOI2010]传送带

P2571 [SCOI2010]传送带 题意&#xff1a; 你要从 A 点到 D 点。有两条传送带&#xff1a;第一条从 A 到 B&#xff0c;速度为 pp&#xff0c;第二条从 C 到 D&#xff0c;速度为 q。不走传送带时速度为 r。求从 A 到 D 的最少时间。 题解&#xff1a; 很明显&#xff0c;答…

你所不知道的ASP.NET Core MVC/WebApi基础系列(二)

冒个泡&#xff0c;算起来估计有很长时间没更新公众号了&#xff0c;估计是我第一次停更如此之久&#xff0c;人总有懒惰的时候&#xff0c;时间越长越懒惰&#xff0c;但是呢&#xff0c;不学又不行&#xff0c;持续的惰性是不行dei&#xff0c;要不然会被时光所抛弃&#xff…

[ZJOI2007]报表统计(链表法+set)

problem 洛谷链接 solution 纯纯不理解要搬用平衡树的那些做法&#xff0c;使我们可可爱爱的链表不香不好写吗&#xff1f;&#xff1f; 众所周知&#xff0c;链表法是可以进行删除和增加的&#xff0c;只需要维护每个点的前驱和后继。 相邻两个的差绝对值的最小值&#x…

POJ-2069 Super Star(最小球覆盖)

POJ-2069 Super Star 题意&#xff1a; 给你n个点&#xff0c;求覆盖所有点的最小球的半径 4<n<30 题解&#xff1a; 求最小球覆盖的步骤&#xff1a; &#xff08;1&#xff09;对于一个点&#xff1a;球心就是这个点&#xff0c;且半径无穷小。 &#xff08;2&…