HDU 6357.Hills And Valleys-字符串非严格递增子序列(LIS最长非下降子序列)+动态规划(区间翻转l,r找最长非递减子序列),好题哇 (2018 Multi-University Training Contest 5 1008)
6357.
自己感觉这是个好题,应该是经典题目,所以半路选手补了这道字符串的动态规划题目。
题意就是给你一个串,翻转任意区间一次,求最长的非下降子序列。
一看题面写的0≤Ai≤9 (i=1,2,⋯,n).就知道肯定有点东西,只要这么写,肯定就是有某个神奇的操作可以解决这道题目。
比赛的时候脑壳都要炸了也没想出来,补题的时候懂了,我可以定义一个b串为0123456789,这肯定是递增的,所以我翻转b的某个区间,然后去和a匹配,因为我把b再翻转回来,还是递增的。
当然了,因为是非严格的递增子序列,有相等的情况,所以相等的时候判断一下,直接+1就可以了。然后枚举一下b的翻转区间就可以了。因为还要输出翻转的区间,所以在dp的时候,用个数组分别保存一下l,r端点就可以了。其他的没什么。
感觉这种思路还是很值得思考的,不处理a,通过其他的操作间接处理a,以后写题要多想想,也写过类似思路的,通过其他的操作间接得到答案,但是一打比赛就没脑子,mdzz,为什么我这么菜༼༎ຶᴗ༎ຶ༽
参考了其他人的题解写出来的。
首先官方题解:

然后别人的博客:HDU6357——Hills And Valleys
代码:
//1008-6357-非严格递增子序列(最长非下降子序列)-字符串+dp-区间翻转,r找最长非递减子序列,好题哇
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<bitset>
#include<cassert>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<deque>
#include<iomanip>
#include<list>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
using namespace std;
typedef long long ll; const double PI=acos(-1.0);
const double eps=1e-;
const ll mod=1e9+;
const int inf=0x3f3f3f3f;
const int maxn=1e5+;
const int maxm=+;
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); int n,a[maxn],dp[maxn][maxm],b[maxm];
int ans,L,R,l,r,h;
int al[maxn][maxm],ar[maxn][maxm]; int solve()
{
for(int i=;i<=h;i++)
dp[][i]=;//初始化
for(int i=;i<=n;i++){//a和b匹配
for(int j=;j<=h;j++){
dp[i][j]=dp[i-][j];
al[i][j]=al[i-][j];//记录左端点
ar[i][j]=ar[i-][j];//记录右端点
if(a[i]==b[j]){//如果有相等的情况,+1
dp[i][j]=dp[i-][j]+;
if(l==j&&!al[i][j])//如果当前的j就是b开始翻转的左端点,更新记录
al[i][j]=i;
if(r==j)//右端点
ar[i][j]=i;
}
if(dp[i][j-]>dp[i][j]){//更新答案
dp[i][j]=dp[i][j-];
al[i][j]=al[i][j-];
ar[i][j]=ar[i][j-];
}
}
}
return dp[n][h];
} char s[maxn]; int main()
{
int t;
scanf("%d",&t);
while(t--){
scanf("%d%s",&n,s+);
for(int i=;i<=n;i++)
a[i]=s[i]-'';
h=;
for(int i=;i<=;i++)
b[++h]=i;
L=R=l=r=;
ans=solve();
for(int i=;i<=;i++){
for(int j=i+;j<=;j++){
h=;
for(int k=;k<=i;k++)
b[++h]=k;//翻转区间的左部分不变
l=h+;
for(int k=j;k>=i;k--)//要翻转的区间把数字翻转
b[++h]=k;
r=h;
for(int k=j;k<=;k++)//反转区间的右部分不变
b[++h]=k;
int tmp=solve();
if(ans<tmp&&al[n][h]&&ar[n][h]){//更新结果
ans=tmp;
L=al[n][h];
R=ar[n][h];
}
}
}
printf("%d %d %d\n",ans,L,R);
}
}
溜了溜了,滚去补数据结构了。
HDU 6357.Hills And Valleys-字符串非严格递增子序列(LIS最长非下降子序列)+动态规划(区间翻转l,r找最长非递减子序列),好题哇 (2018 Multi-University Training Contest 5 1008)的更多相关文章
- HDU - 6357 Hills And Valleys(DP)
http://acm.hdu.edu.cn/showproblem.php?pid=6357 题意 给一个数值范围为0-9的a数组,可以选择翻转一个区间,问非严格最长上升子序列,以及翻转的区间. 分析 ...
- HDU 6357 Hills And Valleys
Hills And Valleys 题意:给你一个序列, 可以翻转一次区间 [l, r] 求最大 非递减的 序列长度. 题解:枚举翻转区间,然后匹配. 如果不翻转区间, 那么就相当于用b[] = {0 ...
- HDU 6357.Hills And Valleys-动态规划(区间翻转l,r找最长非递减子序列)
题意:给一串由n个数字组成的字符串,选择其中一个区间进行翻转,要求翻转后该字符串的最长非降子序列长度最长,输出这个最长非降子序列的长度以及翻转的区间的左右端点 #include<bits/std ...
- 2018 Nowcoder Multi-University Training Contest 2
目录 Contest Info Solutions A. run D. monrey G. transform H. travel I. car J. farm Contest Info Practi ...
- 2019 Multi-University Training Contest 2 - 1008 - Harmonious Army - 最大流
http://acm.hdu.edu.cn/showproblem.php?pid=6598 一开始就觉得是网络流,但是一直都不会怎么建图. 这里要考虑. 每一组边(u,v,a,b,c)建立如下的连接 ...
- HDU 6326.Problem H. Monster Hunter-贪心(优先队列)+流水线排序+路径压缩、节点合并(并查集) (2018 Multi-University Training Contest 3 1008)
6326.Problem H. Monster Hunter 题意就是打怪兽,给定一棵 n 个点的树,除 1 外每个点有一只怪兽,打败它需要先消耗 ai点 HP,再恢复 bi点 HP.求从 1 号点出 ...
- HDU 6305.RMQ Similar Sequence-笛卡尔树+数学期望 (2018 Multi-University Training Contest 1 1008)
6305.RMQ Similar Sequence 这个题的意思就是对于A,B两个序列,任意的l,r,如果RMQ(A,l,r)=RMQ(B,l,r),B序列里的数为[0,1]的实数,B的重量为B的所有 ...
- 2015多校联合训练赛 Training Contest 4 1008
构造题: 比赛的时候只想到:前面一样的数,后面 是类似1,2,3,4,5,6....t这 既是:t+1,t+1...,1,2,3,...t t+1的数目 可能 很多, 题解时YY出一个N 然后对N ...
- 2018 Nowcoder Multi-University Training Contest 10
Practice Link J. Rikka with Nickname 题意: 给出\(n\)个字符串,要求依次合并两个串\(s, t\),满足将\(t\)合并到\(s\)中变成\(r\),使得\( ...
随机推荐
- BZOJ4597 SHOI2016随机序列(线段树)
先考虑题目所说的太简单了的问题.注意到只要把加减号相取反,就可以得到一对除了第一项都互相抵消的式子.于是得到答案即为Σf(i)g(i),其中f(i)为前缀积,g(i)为第i个数前面所有符号均填乘号,第 ...
- Codeforces Round #390 (Div. 2) E(bitset优化)
题意就是一个给出2个字符矩阵,然后进行匹配,输出每个位置的匹配的结果 (超出的部分循环处理) 一种做法是使用fft,比较难写,所以没有写 这里使用一个暴力的做法,考虑到一共只出现26个字符 所以使用一 ...
- 移动开发:美团外卖Android Lint代码检查实践
概述 Lint是Google提供的Android静态代码检查工具,可以扫描并发现代码中潜在的问题,提醒开发人员及早修正,提高代码质量.除了Android原生提供的几百个Lint规则,还可以开发自定义L ...
- Codeforces Round #328 (Div. 2) A
A. PawnChess time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
- centos6上使用fpm打python2.7 rpm包并兼容python2.6
centos6上使用fpm打python2.7 rpm包并兼容python2.6 作者 运维小兵_加油 关注 2016.09.22 00:28 字数 501 阅读 45评论 0喜欢 1 工作中我们常常 ...
- wget下载HTTPS链接
wget -c -O master.zip --no-check-certificate https://github.com/mitsuhiko/flask/archive/master.zip # ...
- CI框架浅析
CI框架浅析(全篇) 业余花了点时间看看CodeIgniter框架(简称CI),CI目前的稳定版本是 3.X,4.0版本已经出来了,但还在测试中,所以我分析的还是 3.x 版本. CI是一个很 ...
- BAT定期删除N天前的文件
1.直接看脚本在win2008测试可用 ::clean logs @echo off title clean up logs ::delete logs FORFILES /P /C "cm ...
- 1、linux下mysql5.5.20安装过程报错汇总
1.Access denied for user 'root'@'localhost' (using password: YES) 这个提示是因为root帐户默认不开放远程访问权限,所以需要修改一下相 ...
- Python基础(9)三元表达式、列表解析、生成器表达式
一.三元表达式 三元运算,是对简单的条件语句的缩写. # if条件语句 if x > f: print(x) else: print(y) # 条件成立左边,不成立右边 x if x > ...