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数组,使得字典 ...
随机推荐
- pynlpir.License过期问题解决方案
报错信息:pynlpir.LicenseError: Your license appears to have expired. Try running "pynlpir update&qu ...
- RedHat Enterprise Linux 5.8 升级openssl
RedHat Enterprise Linux 5.8升级openssl,遇到以下问题,做下标记: 由于之前安装RedHat Enterprise Linux 5.8 时候只安装了服务器环境,没有安装 ...
- 关于:Express会被Koa2取代吗?
知会上看到有个问题<Express会被Koa2取代吗?>.刚好对Express.koa有点小研究,于是简单回答了一下. 1.先说结论 目前没有看到Express会被koa2取代的迹象. 目 ...
- DeepWalk论文精读:(3)实验
模块三 1 实验设计 1.1 数据集 BLOGCATALOG[39]:博客作者网络.标签为作者感兴趣的主题. FLICKR[39]:照片分享网站的用户网络.标签为用户的兴趣群组,如"黑白照片 ...
- ACM-ICPC 2019 山东省省赛总结
五题手快拿银,不然拿铜,甚至不拿,从结果上来看拿了铜牌对第一年的我们来说算好的,也不算太好. 从拿奖后的第一天,我想写这篇博客,但是我忍了下来,那时候被喜悦冲昏了头脑,当 冷静下来,我开始打算写这篇博 ...
- Jenkins 介绍
持续集成: 持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证 ...
- RF(ride 工具使用)
1.新建项目 project,工程 suite,用例 testcase 新建 project:file -> new project,输入工程名,Type 选择 directory,选择工程存放 ...
- Nacos作为配置中心时,多个服务共用一个dataId的配置
写在前面 本文是对我之前一篇文章<Spring Cloud+nacos+Feign,实现注册中心及配置中心>的补充.此文章中简单写了如何将Nacos作为配置中心.在使用配置中心时,我们会遇 ...
- tinymce富文本编辑器整合到django
第一步:定义表存图片路径 models.py class AdminIMG(models.Model): filename = models.CharField(max_length=200, ...
- Re模块的 三个方法
import re s1 = '绿茶白茶黄茶青茶红茶黑茶' s2 = '中国绿茶白茶黄茶青茶红茶黑茶' ret = re.findall(".茶", s1) print(ret) ...