hdu6357 Hills And Valleys
题目大意
给定一个序列A,求翻转A中一个区间之后的最长不降子序列的长度即翻转的区间
分析
发现直接枚举翻转的区间的话是无论如何都不行的,于是有一个非常神奇的做法。我们再设一个序列B = {0,1,2,3,4,5,6,7,8,9},然后我们枚举翻转B中的哪一段,假设我们翻转[5,8]z这一段,则得到B' = {0,1,2,3,4,5,8,7,6,5,8,9},然后设dp[i][j]表示A考虑到第i个,B'考虑到第j个,直接dp转移即可。最终输出的翻转区间单独设数组然后一起转移就行了。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
int dp[][],a[],b[],n,t,le,ri,ansl,ansr,Ans,cnt;
int L[][],R[][];
char s[];
inline void solve(){
int i,j,k;
for(i=;i<=n;i++)
for(j=;j<=cnt;j++){
dp[i][j]=dp[i-][j];
L[i][j]=L[i-][j];
R[i][j]=R[i-][j];
if(a[i]==b[j]){
dp[i][j]=dp[i-][j]+;
if(j==le&&!L[i][j])L[i][j]=i;
if(j==ri)R[i][j]=i;
}
if(dp[i][j-]>dp[i][j]){
dp[i][j]=dp[i][j-];
L[i][j]=L[i][j-];
R[i][j]=R[i][j-];
}
}
return;
}
int main(){
int i,j,k;
scanf("%d",&t);
while(t--){
cnt=;
for(i=;i<=;i++)b[++cnt]=i;
scanf("%d",&n);
scanf("%s",s);
for(i=;i<n;i++)a[i+]=s[i]-'';
le=ri=ansl=ansr=;
solve();
Ans=dp[n][cnt];
for(i=;i<;i++)
for(j=i+;j<=;j++){
cnt=;
for(k=;k<=i;k++)b[++cnt]=k;
le=cnt+;
for(k=j;k>=i;k--)b[++cnt]=k;
ri=cnt;
for(k=j;k<=;k++)b[++cnt]=k;
solve();
if(Ans<dp[n][cnt]&&L[n][cnt]&&R[n][cnt]){
Ans=dp[n][cnt];
ansl=L[n][cnt];
ansr=R[n][cnt];
}
}
printf("%d %d %d\n",Ans,ansl,ansr);
}
return ;
}
hdu6357 Hills And Valleys的更多相关文章
- hdu6357 Hills And Valleys (最长不下降子序列)
题目传送门 题意: 给你0~9的字符串,问你翻转哪个区间后使得其最长不下降子序列长度最长 思路: 因为字符是0~9,所以我们可以定义一个b数组来枚举L,R, 去和原来的字符串去求最长公共子序列长度,不 ...
- HDU 6357 Hills And Valleys
Hills And Valleys 题意:给你一个序列, 可以翻转一次区间 [l, r] 求最大 非递减的 序列长度. 题解:枚举翻转区间,然后匹配. 如果不翻转区间, 那么就相当于用b[] = {0 ...
- HDU - 6357 Hills And Valleys(DP)
http://acm.hdu.edu.cn/showproblem.php?pid=6357 题意 给一个数值范围为0-9的a数组,可以选择翻转一个区间,问非严格最长上升子序列,以及翻转的区间. 分析 ...
- Hills And Valleys 杭电多校第五场
题意:长度为n的序列,有一次翻转区间的机会,问最长不减序列 题解:如果没有翻转区间的机会,有两个做法. 一是dp[i]表示以i结尾的最长序列 dp[i]=max(dp[i],dp[j]+1) (j& ...
- HDU 6357.Hills And Valleys-字符串非严格递增子序列(LIS最长非下降子序列)+动态规划(区间翻转l,r找最长非递减子序列),好题哇 (2018 Multi-University Training Contest 5 1008)
6357. Hills And Valleys 自己感觉这是个好题,应该是经典题目,所以半路选手补了这道字符串的动态规划题目. 题意就是给你一个串,翻转任意区间一次,求最长的非下降子序列. 一看题面写 ...
- kaungbin_DP S (POJ 3666) Making the Grade
Description A straight dirt road connects two fields on FJ's farm, but it changes elevation more tha ...
- POJ 3666 Making the Grade
Description A straight dirt road connects two fields on FJ's farm, but it changes elevation more tha ...
- POJ3666Making the Grade[DP 离散化 LIS相关]
Making the Grade Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6445 Accepted: 2994 ...
- 左偏树(DP)问题
问题:A straight dirt road connects two fields on FJ's farm, but it changes elevation more than FJ woul ...
随机推荐
- burpsuite使用以及repeater模块实现重放攻击
第一.burp suit是什么? Burp Suite 包含了一系列burp 工具,这些工具之间有大量接口可以互相通信,之所以这样设计的目的是为了促进和提高 整个攻击的效率.平台中所有工具共享同一ro ...
- 242. Valid Anagram Add to List
Given two strings s and t, write a function to determine if t is an anagram of s. For example,s = &q ...
- 检测硬件的批处理命令,检测硬件bat,一键获取电脑硬件信息
警告:运行BAT源码是一种危险的动作,如果你不熟悉,请不要尝试! 批处理语言: 简体中文 授权方式: 免费软件 运行环境: Windows平台 检测硬件批处理命令.一键获取.直接双击就可以查看 @ec ...
- Visualforce Page超链接
Salesforce开发者文档:https://developer.salesforce.com/docs/atlas.en-us.pages.meta/pages/pages_quick_start ...
- java编程思想第八章多态
前言: 封装:通过合并特征和行为创建新的数据类型. 实现隐藏:通过将细节“私有化”,把接口和实现分离. 多态:消除类型间的耦合关系.也称作动态绑定,后期绑定或运行时绑定. 8.1再论向上转型: 对象既 ...
- 技术总监Sycx的故事
其实我在各种演讲里,线下吹牛里面无数次提及过他,讲过他的故事,但是总还是没有任何一次认认真真的详细讲过,所以,今天就讲讲他的故事吧. Sycx是福建漳州人,我经常开玩笑说,你生于一个著名的骗子之乡,为 ...
- jsp 的url传参中文乱码问题解决办法
在js文件中,使用连接jsp的url传参,如果参数是中文会出现乱码问题,如下可以解决: 方法一:(已确认 可行) String username = new String(request.getPar ...
- 【转】 Pro Android学习笔记(八四):了解Package(3):包间数据共享
目录(?)[-] 共享User ID的设置 共享资源例子 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowing ...
- HDU 2544 最短路(邻接表+优先队列+dijstra优化模版)
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HTTP-Runoob:HTTP请求方法
ylbtech-HTTP-Runoob:HTTP请求方法 1.返回顶部 1. HTTP请求方法 根据HTTP标准,HTTP请求可以使用多种请求方法. HTTP1.0定义了三种请求方法: GET, PO ...