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数组,使得字典 ...
随机推荐
- BIOS和CMOS区别
在网上看到一篇关于CMOS的文章,分享一下. 原文地址:http://jingyan.baidu.com/article/c843ea0b51155d77921e4a7a.html BIOS是什么? ...
- VulnHub靶场学习_HA: Chanakya
HA-Chanakya Vulnhub靶场 下载地址:https://www.vulnhub.com/entry/ha-chanakya,395/ 背景: 摧毁王国的策划者又回来了,这次他创造了一个难 ...
- web 之 session
Session? 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服务器程序可以 ...
- 从Webpack源码探究打包流程,萌新也能看懂~
简介 上一篇讲述了如何理解tapable这个钩子机制,因为这个是webpack程序的灵魂.虽然钩子机制很灵活,而然却变成了我们读懂webpack道路上的阻碍.每当webpack运行起来的时候,我的心态 ...
- Spring PropertyPlaceholderConfigurer类载入外部配置
2019独角兽企业重金招聘Python工程师标准>>> 通常在Spring项目中如果用到配置文件时,常常会使用org.springframework.beans.factory.co ...
- Entity Framework使用EntityState和Attach来保存数据变化以及更新实体的个别字段
在使用Entity Framework作为ORM来存取数据的过程中,最常规的操作就是对数据对象的更新.本文将会包含如何Attach Entity到一个数据Context中,以及如何使用EntitySt ...
- HTML 页面跳转的五种方法
H方法TML 页面跳转的五种方法 下面列了五个例子来详细说明,这几个例子的主要功能是:在5秒后,自动跳转到同目录下的hello.html(根据自己需要自行修改)文件.1) html的实现 <he ...
- Python网络数据采集- 创建爬虫
1. 初见网络爬虫 1.1 网络连接 输出某个网页的全部 HTML 代码. urllib 是 Python 的标准库(就是说你不用额外安装就可以运行这个例子),包含了从网络请求数据,处理 cookie ...
- Linux常用的安全加固
一.账号和口令 1.1 禁用或删除无用账号 减少系统无用账号,降低安全风险. 操作步骤userdel <用户名> //删除不必要的账号.passwd -l <用户名> //锁定 ...
- Spring Boot入门系列(十三)如何实现事务
前面介绍了Spring Boot 中的整合Mybatis并实现增删改查.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/1 ...