hdu 6357 Hills And Valleys (DP)
http://acm.hdu.edu.cn/showproblem.php?pid=6357
题意:给定一个长度为n只包含‘0’~‘9’的字符串,你可以翻转[l,r]的区间一次,然后求它的最长不下降子序列的长度的最大值,并求出翻转区间。
思路:
我们可以构造一个b序列为0123456789,然后让a序列和b序列来匹配,b可以重复匹配,这样求出来的最长公共序列就是最长不下降序列,然后序列可以翻转一次。我们发现如果在a序列中枚举翻转端点是很难实现的。但可以在b序列上枚举翻转端点(最多C(10,2)种方案)。
换句话说,我们可以枚举翻转的两个端点的值。
然后,b序列可以转化成这个样子:
假设我们枚举的翻转的左端点值为y,右端点值为x,满足x<y
b序列就可以变成:
0,1,2,……x−1,x,(y,y−1,y−2,……,x+1,x),y,y+1,……8,9,注意翻转的左右两个端点要记录两次,然后枚举翻转区间找到最大值,即可。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
#define ll long long
int dp[maxn][22],L[maxn][22],R[maxn][22];
char a[maxn];
int b[maxn];
int c[maxn];
int n,cnt,tl,tr,ans,ansl,ansr,ma,mi;
int work()
{for(int i=1;i<=n;i++){for(int j=0;j<cnt;j++){L[i][j]=0,R[i][j]=0;}}for(int i=0;i<cnt;i++)dp[0][i]=0;for(int i=1;i<=n;i++){for(int j=0;j<cnt;j++){dp[i][j]=dp[i-1][j];L[i][j]=L[i-1][j];R[i][j]=R[i-1][j];if(b[i]==c[j]){dp[i][j]++;if(tl==j&&!L[i][j])L[i][j]=i;if(tr==j)R[i][j]=i;}if(dp[i][j-1]>dp[i][j]&&j>=1){dp[i][j]=dp[i][j-1];L[i][j]=L[i][j-1];R[i][j]=R[i][j-1];}}}return dp[n][cnt-1];
}
int main()
{int T;scanf("%d",&T);while(T--){scanf("%d",&n);scanf("%s",a+1);ma=0;mi=9;for(int i=1;i<=n;i++){b[i]=a[i]-'0';ma=max(b[i],ma);mi=min(b[i],mi);}cnt=0;for(int i=0;i<10;i++)c[cnt++]=i;int ans=work();ansl=1;ansr=1;for(int i=mi;i<=ma;i++){for(int j=mi;j<i;j++){cnt=0;for(int k=0;k<=j;k++)c[cnt++]=k;tl=cnt;for(int k=i;k>=j;k--)c[cnt++]=k;tr=cnt-1;for(int k=i;k<10;k++)c[cnt++]=k;int ans1=work();if(ans1>ans&&L[n][cnt-1]&&R[n][cnt-1]){ans=ans1;ansl=L[n][cnt-1];ansr=R[n][cnt-1];}}}printf("%d %d %d\n",ans,ansl,ansr);}return 0;
}
hdu 6357 Hills And Valleys (DP)相关推荐
- HDU 2639 Bone Collector II (dp)
题目链接 Problem Description The title of this problem is familiar,isn't it?yeah,if you had took part in ...
- HDU 4562 守护雅典娜(dp)
守护雅典娜 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Subm ...
- HDU 6446 Tree and Permutation (dp)
题意:给出一颗树,按节点进行全排列,给你一棵树,以全排列的第一个树为根节点,求出根节点到其他点的最短路径之和,把这些和在相加,求最后结果 分析:对于每一条边都经过了 2*(n-1)!次,用dp算出这棵 ...
- 【HDU - 2089 】不要62 (dp)
题干: 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客 ...
- HDU 5230 ZCC loves hacking(DP)
Problem Description Now, a Codefires round is coming to end. ZCC has got C(0≤C≤106) points by solvin ...
- HDU 6249 Alice’s Stamps(dp)
http://acm.hdu.edu.cn/showproblem.php?pid=6249 题意: 给出n个区间,求选k个区间的最大区间并. 思路: 可能存在左端点相同的多个区间,那么此时我们肯定选 ...
- *【HDU - 5707】Combine String(dp)
题干: Given three strings aa, bb and cc, your mission is to check whether cc is the combine string of ...
- hdu 1257 最少拦截系统 (DP)
点击打开链接 #include"stdio.h" int main() {int a[10011],b[10011];int i,j,c,n;while(scanf("% ...
- 【HDU 5445】Food Problem(DP)
题意:给你n种食物,m种车,每种食物有三种属性能量值t,体积u,数量v.每种车有三个属性值容量x,价格y,数量z.问题是在能够达到至少p能量的要求下,最小花费为多少,若大于50000则输出TAT. 分 ...
- HDU各种比赛题题解(一)
HDU各种比赛题题解(一) Gardon-DYGG Contest 1 HDU1178 Heritage from father[水题] - 海岛Blog - CSDN博客 HDU1181 变形课[D ...
最新文章
- Android基础--tools:context=.TestActivity作用
- Docker自学纪实(三)Docker容器数据持久化
- 平稳随机序列的自相关函数和功率谱密度
- html 批量转换excel,Excel批量转为Html,Html转换成Excel
- java 数组正则表达式_java正则表达式实现提取需要的字符并放入数组【ArrayList数组去重复功能】...
- ubuntu下创建软件图标和直接点文件打开
- 绕过SQL注入限制的方法
- 原型模式的原理与应用
- label标签 for属性
- 智伴机器人班尼_班尼机器人说明书
- 开源库uthash第一弹uthash.h
- 怎么减少别人屏蔽你的朋友圈(一)
- 游戏开发中道具一键合成思路,多级别道具合成,采用递归方法,简单高效。
- 搭便车的时候,请别把车砸了。
- Java 遍历HashMap并修改(remove)
- 虚拟机 Ubuntu16.04开机蓝屏问题
- 抖音多账号零粉直播工具源码实现无人直播
- 主机屋免费服务器 – 真的开启服务器免费时代?
- js获取元素样式-行内样式、内部样式、外部样式
- 安卓APP上线各应用商店-最新版
热门文章
- flutter图标按钮_flutter 导航栏返回按钮带图标
- 动漫头像生成如此简单,教你接口快速制作动漫头像
- 尼采“最孤独者”“忧郁颂”
- Generalized Robust Regression for Jointly Sparse Subspace Learning
- 学生表mysql查询语句
- [渝粤教育] 西北农林科技大学 国际贸易实务 参考 资料
- 微信小程序使用Canvas给图片加水印
- 你可以更幸福(转载)
- 利用iframe覆盖windowed plugin
- 动环监控系统的主要功能,动环监控系统的监控对象有哪些