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)相关推荐

  1. 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 ...

  2. HDU 4562 守护雅典娜(dp)

    守护雅典娜 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Subm ...

  3. HDU 6446 Tree and Permutation (dp)

    题意:给出一颗树,按节点进行全排列,给你一棵树,以全排列的第一个树为根节点,求出根节点到其他点的最短路径之和,把这些和在相加,求最后结果 分析:对于每一条边都经过了 2*(n-1)!次,用dp算出这棵 ...

  4. 【HDU - 2089 】不要62 (dp)

    题干: 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).  杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客 ...

  5. 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 ...

  6. HDU 6249 Alice’s Stamps(dp)

    http://acm.hdu.edu.cn/showproblem.php?pid=6249 题意: 给出n个区间,求选k个区间的最大区间并. 思路: 可能存在左端点相同的多个区间,那么此时我们肯定选 ...

  7. *【HDU - 5707】Combine String(dp)

    题干: Given three strings aa, bb and cc, your mission is to check whether cc is the combine string of  ...

  8. hdu 1257 最少拦截系统 (DP)

    点击打开链接 #include"stdio.h" int main() {int a[10011],b[10011];int i,j,c,n;while(scanf("% ...

  9. 【HDU 5445】Food Problem(DP)

    题意:给你n种食物,m种车,每种食物有三种属性能量值t,体积u,数量v.每种车有三个属性值容量x,价格y,数量z.问题是在能够达到至少p能量的要求下,最小花费为多少,若大于50000则输出TAT. 分 ...

  10. HDU各种比赛题题解(一)

    HDU各种比赛题题解(一) Gardon-DYGG Contest 1 HDU1178 Heritage from father[水题] - 海岛Blog - CSDN博客 HDU1181 变形课[D ...

最新文章

  1. Android基础--tools:context=.TestActivity作用
  2. Docker自学纪实(三)Docker容器数据持久化
  3. 平稳随机序列的自相关函数和功率谱密度
  4. html 批量转换excel,Excel批量转为Html,Html转换成Excel
  5. java 数组正则表达式_java正则表达式实现提取需要的字符并放入数组【ArrayList数组去重复功能】...
  6. ubuntu下创建软件图标和直接点文件打开
  7. 绕过SQL注入限制的方法
  8. 原型模式的原理与应用
  9. label标签 for属性
  10. 智伴机器人班尼_班尼机器人说明书
  11. 开源库uthash第一弹uthash.h
  12. 怎么减少别人屏蔽你的朋友圈(一)
  13. 游戏开发中道具一键合成思路,多级别道具合成,采用递归方法,简单高效。
  14. 搭便车的时候,请别把车砸了。
  15. Java 遍历HashMap并修改(remove)
  16. 虚拟机 Ubuntu16.04开机蓝屏问题
  17. 抖音多账号零粉直播工具源码实现无人直播
  18. 主机屋免费服务器 – 真的开启服务器免费时代?
  19. js获取元素样式-行内样式、内部样式、外部样式
  20. 安卓APP上线各应用商店-最新版

热门文章

  1. flutter图标按钮_flutter 导航栏返回按钮带图标
  2. 动漫头像生成如此简单,教你接口快速制作动漫头像
  3. 尼采“最孤独者”“忧郁颂”
  4. Generalized Robust Regression for Jointly Sparse Subspace Learning
  5. 学生表mysql查询语句
  6. [渝粤教育] 西北农林科技大学 国际贸易实务 参考 资料
  7. 微信小程序使用Canvas给图片加水印
  8. 你可以更幸福(转载)
  9. 利用iframe覆盖windowed plugin
  10. 动环监控系统的主要功能,动环监控系统的监控对象有哪些