洛谷P2501数字序列 动态规划

题目

题目链接

题解

这道题目我觉得是神题,非常有意思的题目,也挺难做的。

第一问:求最少需要改变的数量

这一问比较简单,之前也见过这种套路。
定义dp[i]dp[i]表示aa序列中a[1,i]部分构成严格递增子序列且以a[i]a[i]为结尾所不需要改变的最大的数量。
那么转移方程就是:
dp[i]=min1j<i,a[i]a[j]>=ij(dp[j]+1)dp[i]=min1≤j<i,a[i]−a[j]>=i−j(dp[j]+1)
那么我们稍微对转移方程做一个变形:
dp[i]=min1j<i,a[i]ia[j]j(dp[j]+1)dp[i]=min1≤j<i,a[i]−i≥a[j]−j(dp[j]+1)
我们发现如果让a[i]=ia[i]−=i的话,这就是一个最长非降子序列,我们可以使用二分的方法在O(nlogn)O(nlogn)的时间解决。
mxlenmxlen即是整个aa序列能构成最长非降子序列的长度值。
那么第一问的答案就是nmxlen

在我们求解最长非减子序列的时候,我们需要处理出一个数组ff,f[i]表示以以a[i]a[i]结尾的最长非减序列的长度。以及mxlenmxlen个链表nxtnxt(我在代码里用vector表示的),nxt[i][j]nxt[i][j]表示满足f[x]=if[x]=i的第jj大的x
用这些处理好的信息,我们就可以来做第二问了。

第二问:求改变的最小花费

在求改变的最小花费的时候我们仍然使用dpdp的方法来解决。
我们定义dp2[i]dp2[i]表示a[1,i]a[1,i]已经被修改成为最长非减子序列,并且末尾的a[i]a[i]没有被修改,所花费的最大值。

那么转移方程可以写成:
dp2[i]=min0j<i,f[i]=f[j]+1(dp2[j]+cost(j+1,i1))dp2[i]=min0≤j<i,f[i]=f[j]+1(dp2[j]+cost(j+1,i−1))
这个cost(j+1,i1)cost(j+1,i−1)表示将a[j+1,i1]a[j+1,i−1]中的所有元素都修改成为介于[a[j],a[i]][a[j],a[i]]之间的元素所花费的最小值。
我们来计算这个cost(j+1,i1)cost(j+1,i−1)
首先,对于所有a[x]a[x]要么>a[i]>a[i],要么 <a[j]<a[j]<script type="math/tex" id="MathJax-Element-17815">< a[j]</script>。
因此我们所采取的最优策略就是找出一个分界点kk,使得a[j,k]中的元素全都等于a[j]a[j]使得a[k+1,i]a[k+1,i]中的元素全部都等于a[i]a[i],其中jk<ij≤k<i
那么
cost(j+1,i1)=minjk<i(jxk|a[x]a[j]|+k<x<i|a[x]a[i]|)cost(j+1,i−1)=minj≤k<i(∑j≤x≤k|a[x]−a[j]|+∑k<x<i|a[x]−a[i]|)
这样的话,我们枚举i,j,ki,j,k就可以把这道题目在O(n3)O(n3)的时间复杂度内解决掉。

下面我们看看能不能优化。

枚举ii肯定不能省掉,对i,我们再开始枚举jj,注意,我们直接在nxt链表中找到满足条件的jj,而且我们枚举j的顺序是按照jj从大到小的顺序,这样的话,我们可以顺手记录一个sum,表示当前把a[j+1,i1]a[j+1,i−1]之间的元素全部都改变到a[i]a[i]了。即sum=j<xi|a[x]a[i]|sum=∑j<x≤i|a[x]−a[i]|
然后假设最优决策点是kk,其中jk<i。再假设a[j+1,k]a[j+1,k]之间有zz个小于a[i],有yy个大于a[i]
那么cost(j+1,i1)=sum(a[i]a[j])z+(a[i]a[j])ycost(j+1,i−1)=sum−(a[i]−a[j])∗z+(a[i]−a[j])∗y
cost(j+1,i1)=sum(a[i]a[j])(zy)cost(j+1,i−1)=sum−(a[i]−a[j])∗(z−y)
想要使得costcost最小,必须让zyz−y最大。

但实际上要求jj位置开始的前缀的zy的最大值不好求,我们可以反过来想,当iij固定的时候,zyz−y的值也就固定了,我们可以通过求从ii开始的后缀中zy的最小值。

这样这个题就可以在O(n2+nlogn)O(n2+nlogn)的最差时间复杂度内解决掉了。

由于题目保证随机数据,所以n2n2根本不可能跑满。

事实上还跑的很快。

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
const int maxn = 1e5;
const ll inf = 0x3f3f3f3f;
typedef pair<int,ll> pii;
int n;
ll dp[maxn],a[maxn],f[maxn];
vector<int> nxt[maxn];
ll dp2[maxn];
int dfs(int u){if(dp2[u] != -1) return dp2[u];int ni = u;ll sum = 0,z = 0,y = 0;ll mizy = 0,res = 0;for(int i = nxt[f[u]-1].size()-1;i >= 0;--i){int nj = nxt[f[u]-1][i];if(nj > u || a[nj] > a[u]) continue;for(int j = ni;j > nj;--j){sum += abs(a[j] - a[u]);if(a[j] < a[u]) z++;if(a[j] > a[u]) y++;mizy = min(mizy,z-y);}ni = nj;int rr = sum - (a[u]-a[nj])*(z-y-mizy)+dfs(nj);if(!res || rr < res) res = rr;}return dp2[u] = res;
}
int main()
{memset(dp2,-1,sizeof(dp2));scanf("%d",&n);for(int i = 1;i <= n;++i) scanf("%lld",&a[i]),a[i] -= i;a[0] = -inf,a[n+1] = inf; memset(dp,inf,sizeof(dp));for(int i = 1;i <= n;++i){int loc = upper_bound(dp+1,dp+1+n,a[i]) - dp;dp[loc] = a[i];f[i] = loc;nxt[f[i]].push_back(i);}int mxlen = lower_bound(dp+1,dp+1+n,inf) - dp - 1;cout<<n - mxlen<<endl;a[n+1] = inf;f[n+1] = mxlen+1;dp2[0] = 0;ll ans = dfs(n+1);cout<<ans<<endl;  
} 

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

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

相关文章

用ASP.NET Core 2.1 建立规范的 REST API -- HATEOAS

本文所需的一些预备知识可以看这里: 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 和 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 (2) 准备项目建立Richardson成熟度2级的POST、GET、PUT、PATCH、DELETE的RESTful API请看这里&#xff1a;用ASP.NET Core …

学习手记(2020/8/19~2021/3/19)

文章目录所有集合子集数量和结论证明枚举子集的方法最大匹配模的次数线性基卡特兰数树形dpTipTipTip斯特林数斐波那契幂前缀和hallhallhall定理阿巴阿巴1狄利克雷卷积常用式子组合数学恒等式竞赛图性质一些博弈模型基础反演二项式反演莫比乌斯反演欧拉反演子集反演min-max\text…

codeforces gym-101736 Farmer Faul 平衡树+并查集

题目 题目链接 题意 给出nn个整数,其中1&#x2264;n&#x2264;106" role="presentation" style="position: relative;">1≤n≤1061≤n≤106。 给出三种操作&#xff1a; GROW x y,表示给xx位置的数增加y" role="presentation&…

奶牛的交叉路(jzoj 1756)

奶牛的交叉路 题目大意&#xff1a; 有两个数轴&#xff0c;之间有n条线分别连接着两个数轴的点各一个&#xff0c;这些线可能会相交&#xff0c;问有多少条线没有和其他点相交 样例输入 4 -3 4 7 8 10 16 3 9样例输出 2数据范围限制 1<N<100000&#xff0c;-1…

.Net Core 环境下构建强大且易用的规则引擎

1. 引言1.1 为什么需要规则引擎在业务的早期时代&#xff0c;也许使用硬编码或者逻辑判断就可以满足要求。但随着业务的发展&#xff0c;越来越多的问题会暴露出来&#xff1a;逻辑复杂度带来的编码挑战&#xff0c;需求变更时改变逻辑可能会引起灾难重复性的需求必须可重用&am…

【最短路】【SPFA】单源最短路径 (luogu 3371)

单源最短路径 luogu 3371 题目大意&#xff1a; 求出一个点到其他点的最短路 原题&#xff1a; 题目背景 本题测试数据为随机数据&#xff0c;在考试中可能会出现构造数据让SPFA不通过&#xff0c;如有需要请移步 P4779。 题目描述 如题&#xff0c;给出一个有向图&…

P59330-[清华集训2012]串珠子【状压dp】

正题 题目链接:https://www.luogu.com.cn/problem/P5933 题目大意 nnn个点的一张无向图&#xff0c;求所有联通子图的权值乘积和 解题思路 因为nnn很小&#xff0c;考虑状压 设fif_ifi​表示点集为iii时的方案数&#xff0c;我们发现正着做十分麻烦&#xff0c;考虑容斥。 首…

codeforces gym-101736 Dessert First Strategy 最小割

题目 题目链接 题解 很典型的最小割模型问题&#xff0c;我们知道颜色不确定的点最终要么是白色&#xff0c;要么是黑色&#xff0c;是两种对立的状态&#xff0c;我们联想到了最小割。 最小割是割掉权值和最小的边集&#xff0c;使得图中的点分成两个点集&#xff0c;一个…

在Windows 下如何使用 AspNetCore Api 和 consul

一、概念&#xff1a;什么是consul:Consul 是有多个组件组成的一个整体&#xff0c;作用和Eureka,Zookeeper相当&#xff0c;都是用来做服务的发现与治理。 Consul的特性&#xff1a;1、 服务的发现&#xff1a;consul可以把注册到其中的服务提供给使用者&#xff0c;也可以主动…

CF590E-Birthday【AC自动机,最大独立集】

正题 题目链接:https://www.luogu.com.cn/problem/CF590E 题目大意 nnn个字符串&#xff0c;求一个最大的集合使其中没有任何串是其他集合内字符串的子串 解题思路 先用ACACAC自动机建立好failfailfail树传递闭包就可以确定好两两之间的子串关系了&#xff0c;之后用网络流最…

【最短路】【SPFA】电车 (luogu 1346)

电车 luogu 1346 题目大意&#xff1a; 有n个点&#xff0c;要从一个点到另一个点&#xff0c;每个点连接着其他ai个点&#xff0c;到连接的第一个点路径长度为0&#xff0c;其他长度为1&#xff0c;求最短路 题目描述 在一个神奇的小镇上有着一个特别的电车网络&#xff…

网络流及建模专题(下)

前言 不断更新中… 专题的(下)篇将介绍网络流的一些奇奇怪怪的应用和费用流有关的一些套路。 本专题暂时包含三道题&#xff1a; 洛谷P1251 餐巾计划问题: 费用流的基本应用 Trade Gym - 100212I: 使用网络流对图论中的边进行调整 codeforces 818G - Four Melodies: 费用…

CentOS 7.4 下 如何部署 AspNetCore 结合 consul

上篇我们讲到consul的概念&#xff0c;以及在WIN下如何使用&#xff1a; 在Windows 下如何使用 AspNetCore Api 和 consul步骤如下&#xff1a;1、安装虚拟机VM 2、下载安装 CentOS 7.4&#xff08;地址就不提供了&#xff09;这是安装示例&#xff1a; VM虚拟机安装CentOS 示例…

P4083-[USACO17DEC]A Pie for a Pie G【线段树,最短路】

正题 题目链接:https://www.luogu.com.cn/problem/P4083 题目大意 开始时AAA和BBB各有两个礼物&#xff0c;每个礼物对两个人有不同的价值&#xff0c;开始时AAA会送BBB一个礼物。 对于一个收到礼物的人&#xff0c;如果该礼物对他来说价值为valvalval&#xff0c;那么他会回…

【SPFA】最优贸易(luogu 1073)

最优贸易 luogu 1073 题目大意&#xff1a; 有n个城市和m条线路连接着这些城市&#xff08;当编号为1时是有向&#xff0c;2时是无向&#xff09;&#xff0c;从1城市出发到n城市&#xff0c;每个城市都有固定的水晶球价格&#xff08;进价和售价一样&#xff09;&#xff0…

Razor Page Library:开发独立通用RPL(内嵌wwwroot资源文件夹)

Demo路径&#xff1a;https://github.com/yanshengjie/RPL.Demo1. IntroductionRazor Page Library 是ASP.NET Core 2.1引入的新类库项目&#xff0c;属于新特性之一&#xff0c;用于创建通用页面公用类库。也就意味着可以将多个Web项目中通用的Web页面提取出来&#xff0c;封装…

Problem H Rock Paper Scissors,FFT

题目 题目链接 题意 给出两段石头剪刀布的顺序SS和T" role="presentation" style="position: relative;">TT&#xff0c;其中TT要短一些,现在让你把T" role="presentation" style="position: relative;">TT往SS的…

CF1066F-Yet another 2D Walking【贪心】

正题 题目链接:https://www.luogu.com.cn/problem/CF1066F 题目大意 平面上有nnn个点&#xff0c;每个点在max(x,y)max(x,y)max(x,y)层&#xff0c;走第kkk层的点之前一定要先走前面层的点&#xff0c;求走完所有点的最短路。 解题思路 对于每一层来说&#xff0c;我们可以将…

【最短路】【SPFA】城市问题(ssl 1761)

城市问题 ssl 1761 题目大意&#xff1a; 求一个点到其它点的最短路 原题&#xff1a; Description 设有n个城市&#xff0c;依次编号为0&#xff0c;1&#xff0c;2&#xff0c;……&#xff0c;n-1&#xff08;n<100&#xff09;&#xff0c;另外有一个文件保存n个城…

.NET Core微服务之基于Ocelot实现API网关服务

一、啥是API网关&#xff1f;API 网关一般放到微服务的最前端&#xff0c;并且要让API 网关变成由应用所发起的每个请求的入口。这样就可以明显的简化客户端实现和微服务应用程序之间的沟通方式。以前的话&#xff0c;客户端不得不去请求微服务A&#xff08;假设为Customers&am…