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数组,使得字典 ...
随机推荐
- MinIO 的分布式部署
目录 1 前言 2 分布式存储可靠性常用方法 2.1 冗余 2.2 校验 3 MinIO存储机制 3.1 概念理解 3.2 纠删码EC(Erasure Code) 3.3 存储形式 4 部署实践 4. ...
- Win10 及 Google 浏览器显示界面异常
win10 和 google 界面显示异常 win10 个别 ui 组件花屏,google 界面直接黑屏 解决方式 更新集成显卡或者重装显卡驱动,最好使用 驱动人生 !!!
- 【Linux常见问题】CentOS 7 root用户密码忘记,找回密码方法
1.开机按esc 2.选择CentOS Linux (3.10.0-693.......) 按 e 键: 3.光标移动到 linux 16 开头的行,找到 ro 改为 rw init=sysr ...
- HTML JavaScript 基础(上)
一.初识JavaScript JavaScript 和 Java什么关系? 半毛线关系都没有,只是名字有点重合而已. JavaScript 和python.C#.Java.Ruby一样,都是一门独立的 ...
- CTO为何要微服务评估
为什么定义参考模型 之前我的工作,大部分时间都是聚焦在某个产品/团队,为他们提供微服务/DevOps的实施及指导.进入公司后,同时参与了多个产品团队的改造研讨.其中最大的不同在于: 在面对一个团队的时 ...
- itchat学习
itchat是一个开源的微信个人号接口,可以很方便的使用python调用微信. 教程如下:https://itchat.readthedocs.io/zh/latest/ 简单试玩了一下,觉得还挺有趣 ...
- Eclipse Collections:让Java Streams更上一层楼
\ 关键要点 \\ Eclipse Collections是一个高性能的Java集合框架,为原生JDK集合增加了丰富的功能.\\t Streams是JDK的一个非常受欢迎的功能,但它缺少了一些特性,严 ...
- Fourier Transform
为了在统一框架里分析周期信号与非周期信号,可以给周期信号也建立傅里叶变换. 有两种方法求周期信号的傅里叶变换: **1. 利用傅里叶级数进行构造 ** 对于周期信号\(x(t)\),其傅里叶级数展开式 ...
- codeforce 227D Naughty Stone Piles (贪心+递归+递推)
Description There are n piles of stones of sizes a1, a2, -, an lying on the table in front of you. D ...
- Nginx模块开发(3)————使用upstream访问第三方服务
该模块可以完成如下的功能,当我们输入http://你的ip/lcwupstream时,会使用upstream方式访问淘宝搜索,打开淘宝搜索的主页面,代码如下: //start from the ver ...