Hills And Valleys 杭电多校第五场
题意:长度为n的序列,有一次翻转区间的机会,问最长不减序列
题解:如果没有翻转区间的机会,有两个做法。
一是dp[i]表示以i结尾的最长序列 dp[i]=max(dp[i],dp[j]+1) (j<=i)。
二是那个抽牌替换的解法。
这道题可以翻转但是值域很小,所以考虑最长子序列和值域的关系。
选择第一种解法改进。
显然不翻转的话是序列A与 序列B ={0123456789} 来匹配,B中的元素可以被匹配到多次。
现在要求翻转一次后的最长子序列,直接翻转A的复杂度是C(n,2)*n*10。
考虑有效翻转的意义,一定是将(只有)一个递减的序列变为递增。
这就相当于在被匹配的B序列中插入一个递减序列来被A匹配。
比如A是12345564678,直接匹配的对应的B'序列是12345(64)678,也就是B中多加了一个递减序列。
所以可以不翻转A,翻转B,这样复杂度就将为C(10,2)*n*20。
实现问题的话,可以在第二位数值域上多加10个来记录要添加的递减序列长度。
关于记录位置,因为只需考虑值域,所以只需开两个L[20],R[20]数组来记录以数字i结尾的(每个数分递减递增)左边和右边翻转区域即可。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+;
int dp[N][],n,T,len[],L[],R[];
int ans,l,r;
char s[N];
void solve(int ll,int rr){
int tar;
for(int i=;i<=n;++i) for(int j=;j<;++j) dp[i][j]=;
for(int i=;i<;++i) len[i]=;
for(int i=;i<;++i) L[i]=R[i]=;
for(int i=;i<=n;++i) {
tar=s[i]-'';
for(int j=tar;j>=;--j) {
if(dp[i][tar]<len[j]+) {
dp[i][tar]=len[j]+;
if(L[j]) L[tar]=L[j];else L[tar]=i;
if(R[j]) R[tar]=R[j];else R[tar]=i;
}
}
if(ll<=tar&&tar<=rr) {
for(int j=tar+;j<=+rr;++j) {
if(dp[i][tar+]<len[j]+) {
dp[i][tar+]=len[j]+;
if(!L[j]) L[tar+]=i;else L[tar+]=L[j];
R[tar+]=i;
}
}
for(int j=;j<=ll;++j) if(dp[i][tar+]<len[j]+){
dp[i][tar+]=len[j]+;
L[tar+]=R[tar+]=i;
}
}
if(tar>=rr) {
for(int j=+ll;j<=+rr;++j) {
if(dp[i][tar]<len[j]+) {
dp[i][tar]=len[j]+;
L[tar]=L[j],R[tar]=R[j];
}
}
}
if(dp[i][tar]>ans) ans=dp[i][tar],l=L[tar],r=R[tar];
if(ll<=tar&&tar<=rr&&ans<dp[i][tar+]) ans=dp[i][tar+],l=L[tar+],r=R[tar+];
for(int j=;j<;++j) len[j]=max(len[j],dp[i][j]);
}
}
int main(){
for(scanf("%d",&T);T--;){
scanf("%d",&n);
scanf("%s",s+);
ans=;
l=r=;
for(int i=;i<;++i) for(int j=i+;j<;++j) solve(i,j);
printf("%d %d %d\n",ans,l,r);
}
}
Hills And Valleys 杭电多校第五场的更多相关文章
- 2018杭电多校第五场1002(暴力DFS【数位】,剪枝)
//never use translation#include<bits/stdc++.h>using namespace std;int k;char a[20];//储存每个数的数值i ...
- 2017杭电多校第五场11Rikka with Competition
Rikka with Competition Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/O ...
- 2017杭电多校第五场Rikka with Subset
Rikka with Subset Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- hdu6356 Glad You Came 杭电多校第五场 RMQ ST表(模板)
Glad You Came Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) ...
- [2019杭电多校第五场][hdu6630]permutation 2
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6630 题意为求出1-n,n个数的全排列中有多少种方案满足第一位为x,第n位为y,且相邻数字绝对值之差不 ...
- [2019杭电多校第五场][hdu6624]fraction
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6624 题意为求最小的b满足$a*b^{-1}\equiv x(modp)$. 把式子化简一下: $a\ ...
- [2019杭电多校第五场][hdu6629]string matching(扩展kmp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6629 题意求字符串的每个后缀与原串的最长公共前缀之和. 比赛时搞东搞西的,还搞了个后缀数组...队友一 ...
- [2019杭电多校第五场][hdu6628]permutation 1
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6628 题意为求字典序第k小的差异数组,差异数组p满足p[i]=a[i+1]-a[i]. 头铁的爆搜,因 ...
- [2019杭电多校第五场][hdu6625]three arrays(01字典树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6625 大意为给你两个数组a和b,对应位置异或得到c数组,现在可以将a,b数组从新排序求c数组,使得字典 ...
随机推荐
- [转] Exchange 2013 安装部署详解
·Exchange 2013 部署:系统要求 823 / 3 部署 系统要求 Exchange 2013 zhou_ping 2013-02-17 ·Exchange 2013 部署:先决条件 752 ...
- layui模块化加载Echarts图表v4.2.1
layui.use(['jquery','echarts'], function () { var $ = layui.$; //记得这是dom对象不是JQ对象,需要转换 echarts = layu ...
- 解决虚拟机中linux系统无法使用本机无线wifi联网的问题
VMware Workstation 在嵌入式开发中经常会遇到,但是显示大多数人使用开发环境是Win10 + 无线网卡,针对这种情况,需要配置虚拟机的上网环境使用的是NAT模式,将配置过程进行描述: ...
- Educational Codeforces Round 77 (Rated for Div. 2) C. Infinite Fence
C. Infinite Fence 题目大意:给板子涂色,首先板子是顺序的,然后可以涂两种颜色,如果是r的倍数涂成红色,是b的倍数涂成蓝色, 连续的k个相同的颜色则不能完成任务,能完成任务则输出OBE ...
- Linux创建软硬链接和打包压缩、解压缩
软硬链接 ln = link make links between files 语法: 软链接 ln -s 源文件 链接名称 实例: ln -s HelloWord.java hw.lnk 给Hell ...
- 【GISER&&规划】我这二三年
从从参加工作到现在,已经接近三年了.在这不长不短的时间里,我的职业规划犹如正余弦函数一样变化,一直游离在前端和后端之间. 第一年入职,被安排维护和拓展一套基于JAVA实现的地图瓦片生产工艺程序,不算复 ...
- 【杂谈】Disruptor——RingBuffer问题整理(一)
纯CAS为啥比加锁要快? 同样是修改数据,一个采用加锁的方式保证原子性,一个采用CAS的方式保证原子性. 都是能够达到目的的,但是常用的锁(例如显式的Lock和隐式的synchonized),都会把获 ...
- C#黔驴技巧之去重(Distinct)
前言 关于C#中默认的Distinct方法在什么情况下才能去重,这个就不用我再多讲,针对集合对象去重默认实现将不再满足,于是乎我们需要自定义实现来解决这个问题,接下来我们详细讲解几种常见去重方案,孰好 ...
- Java的Object.wait(long)在等待时间过去后会继续往后执行吗
Java的Object.wait(long)在等待时间过去后会继续往后执行吗 Object.wait(long)方法相比于wait,多了个等待时长,那么当等待时长过去后,线程会继续往下执行吗? 单个线 ...
- 排序算法整理(Python实现)
目录 1. 冒泡排序 2. 选择排序 3. 插入排序 4. 归并排序 5. 快速排序 1. 冒泡排序 冒泡排序(Bubble Sort)是稳定排序,其基本思想是:遍历待排序列,依次两两比较,如果顺 ...