题意:求任意删除字符后所形成的最长回文,并输出字典序最小的方案

把原串反转求LIS,因为转移时不断求字典序最小导致后半部分可能并非回文,所以要前半部分输出两边

话说这方案保存可真暴力

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<cstdlib>
  6. #include<cmath>
  7. #include<string>
  8. #include<vector>
  9. #include<stack>
  10. #include<queue>
  11. #include<set>
  12. #include<map>
  13. #define rep(i,j,k) for(register int i=j;i<=k;i++)
  14. #define rrep(i,j,k) for(register int i=j;i>=k;i--)
  15. #define erep(i,u) for(register int i=head[u];~i;i=nxt[i])
  16. #define iin(a) scanf("%d",&a)
  17. #define lin(a) scanf("%lld",&a)
  18. #define din(a) scanf("%lf",&a)
  19. #define s0(a) scanf("%s",a)
  20. #define s1(a) scanf("%s",a+1)
  21. #define print(a) printf("%lld",(ll)a)
  22. #define enter putchar('\n')
  23. #define blank putchar(' ')
  24. #define println(a) printf("%lld\n",(ll)a)
  25. #define IOS ios::sync_with_stdio(0)
  26. using namespace std;
  27. const int maxn = 1e3+11;
  28. const double eps = 1e-10;
  29. typedef long long ll;
  30. const int oo = 0x3f3f3f3f;
  31. ll read(){
  32. ll x=0,f=1;register char ch=getchar();
  33. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  34. while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
  35. return x*f;
  36. }
  37. char str[maxn],strr[maxn];
  38. int dp[maxn][maxn];
  39. string ans[maxn][maxn];
  40. int main(){
  41. while(~s1(str)){
  42. int n=strlen(str+1);
  43. rep(i,1,n) strr[n-i+1]=str[i];
  44. memset(dp,0,sizeof dp);
  45. rep(i,0,n)rep(j,0,n) ans[i][j]=" ";
  46. int len=0;
  47. rep(i,1,n) rep(j,1,n){
  48. if(str[i]==strr[j]){
  49. dp[i][j]=dp[i-1][j-1]+1;
  50. ans[i][j]=ans[i-1][j-1]+str[i];
  51. }else{
  52. dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
  53. if(dp[i-1][j]>dp[i][j-1]) ans[i][j]=ans[i-1][j];
  54. else if(dp[i][j-1]>dp[i-1][j]) ans[i][j]=ans[i][j-1];
  55. else if(ans[i][j-1]<ans[i-1][j]) ans[i][j]=ans[i][j-1];
  56. else ans[i][j]=ans[i-1][j];
  57. }
  58. }
  59. if(dp[n][n]&1){
  60. rep(i,1,(dp[n][n]+1)/2) cout<<ans[n][n][i];
  61. rep(i,1,dp[n][n]/2) cout<<ans[n][n][dp[n][n]/2-i+1];
  62. cout<<endl;
  63. }else{
  64. rep(i,1,dp[n][n]/2) cout<<ans[n][n][i];
  65. rep(i,1,dp[n][n]/2) cout<<ans[n][n][dp[n][n]/2-i+1];
  66. cout<<endl;
  67. }
  68. // cout<<ans[n][n]<<endl;
  69. }
  70. return 0;
  71. }

UVA - 11404的更多相关文章

  1. UVA 11404 Palindromic Subsequence[DP LCS 打印]

    UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...

  2. UVA 11404 五 Palindromic Subsequence

     Palindromic Subsequence Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu ...

  3. 【UVA 11404】Palindromic Subsequence

    UVA 11404 我用了最暴力的做法:考虑\(dp[i][j]\)表示\(S[i..j]\)的最长回文子序列的长度以及字典序最小的那个. 然后转移的时候如下处理:首先\(dp[i][j]\)要取\( ...

  4. uva 11404 dp

    UVA 11404 - Palindromic Subsequence 求给定字符串的最长回文子序列,长度一样的输出字典序最小的. 对于 [l, r] 区间的最长回文串.他可能是[l+1, r] 和[ ...

  5. LPS UVA 11404 Palindromic Subsequence

    题目传送门 题意:求LPS (Longest Palidromic Subsequence) 最长回文子序列.和回文串不同,子序列是可以不连续的. 分析:1. 推荐->还有一种写法是用了LCS的 ...

  6. UVA 11404 Palindromic Subsequence

    Palindromic Subsequence Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVA ...

  7. UVa 11404 回文子序列(LCS求最长回文串长度)

    https://vjudge.net/problem/UVA-11404 题意: 给定一个由小写字母组成的字符串,删除其中的0个或多个字符,使得剩下的字母(顺序不变)组成一个尽量长的回文串.如果有多解 ...

  8. UVA 11404 Plalidromic Subsquence (回文子序列,LCS)

    最长回文子序列可以用求解原串s和反转串rv的LCS来得到,因为要求回文串分奇偶,dp[i][j]保存长度, 要求字典序最小,dp[i][j]应该表示回文子序列的端点,所以边界为单个字符,即i+j=le ...

  9. UVa 11404 Palindromic Subsequence (LCS)

    题意:给定一个字符串,问删除一些字符,使得它成为一个最长回访串,如果有多个,输出字典序最小的那个. 析: 我们可以把原字符串反转,然后求两个串的LCS,就得到最长回文串,不过要注意一些细节. 代码如下 ...

随机推荐

  1. css常见问题解决方法

    设置方法: div内的img和span都需要设置vertical-align:middle; 解决inline-block的空格: http://www.w3cplus.com/css/fightin ...

  2. Solidity payable 方法表现

    pragma solidity ^; contract Person { string public name; uint age; uint private weight; string inter ...

  3. 41、OrthoMCL和mcl软件进行基因家族分析

    转载:http://www.realbio.cn/news/124.html https://blog.csdn.net/seallama/article/details/43820763 http: ...

  4. caret 分类回归树 用法

    http://topepo.github.io/caret/feature-selection-overview.html

  5. CF519E A and B and Lecture Rooms

    最近很颓……难题想不动……水题写不对,NOIP怕是

  6. 利用AdaBoost方法构建多个弱分类器进行分类

    1.AdaBoost 思想 补充:这里的若分类器之间有比较强的依赖关系;对于若依赖关系的分类器一般使用Bagging的方法 弱分类器是指分类效果要比随机猜测效果略好的分类器,我们可以通过构建多个弱分类 ...

  7. C# 用代码返回上一页

    若我们在后台.cs文件中想做到让浏览器返回上一页,我们可以在.cs代码中这样写 Page.ClientScript.RegisterStartupScript(Page.GetType(), &quo ...

  8. Python中常用模块二

    一.hashlib   (加密) hashlib:提供摘要算法的模块 1.正常的md5算法 import hashlib # 提供摘要算法的模块 md5 = hashlib.md5() md5.upd ...

  9. IntelliJ IDEA——利用maven插件构建web工程

  10. android onResultActivity不执行原因总结

    插一个注意点.在用ArrayAdapter的时候数据那里的类型必须是List<String> 不能是ArrayList<String> 1.在A.Activity中调用star ...