UVA 10029 - Edit Step Ladders

举报
Linux猿 发表于 2021/08/04 23:04:17 2021/08/04
【摘要】 题目链接~~> 做题感悟:开始做这题时每次向前寻找最优时就用LCS判断一下是否可以转化,结果超时,最后看了一下才知道原来这样。 解题思路:                判断当前字符串时,枚举每一种情况,包括添加,删除,改写一个字符,然后就是关键之处了,寻找的时候用二分查找,有的人可能...

题目链接~~>

做题感悟:开始做这题时每次向前寻找最优时就用LCS判断一下是否可以转化,结果超时,最后看了一下才知道原来这样。

解题思路:

               判断当前字符串时,枚举每一种情况,包括添加,删除,改写一个字符,然后就是关键之处了,寻找的时候用二分查找,有的人可能不解,这样怎么用二分呢 ? 你太低估二分的实力了,因为给的字符串是有序的可以用字符串比较函数比较,这样就可以二分了。

代码:


  
  1. #include<iostream>
  2. #include<iomanip>
  3. #include<string.h>
  4. #include<string>
  5. #include<stdio.h>
  6. #include<stdlib.h>
  7. using namespace std ;
  8. const int MY = 20 ;
  9. const int MX = 25000 + 10 ;
  10. int n ;
  11. int dp[MX] ;
  12. char s[MX][MY],str[MY] ;
  13. void change(char *s1,char *s2,int x,char ch)// 改变对应位置字符
  14. {
  15. int p=0 ;
  16. for(int i=0 ;s1[i] ;i++)
  17. if(i==x)
  18. s2[p++]=ch ;
  19. else s2[p++]=s1[i] ;
  20. s2[p++]='\0' ;
  21. }
  22. void add(char *s1,char *s2,int x,char ch) // 添加字符
  23. {
  24. int len=strlen(s1),p=0 ;
  25. for(int i=0 ;i<x ;i++)
  26. s2[p++]=s1[i] ;
  27. s2[p++]=ch ;
  28. for(int i=x ;i<len ;i++)
  29. s2[p++]=s1[i] ;
  30. s2[p++]='\0' ;
  31. }
  32. void del(char *s1,char *s2,int x) // 删除对应字符
  33. {
  34. int p=0 ;
  35. for(int i=0 ;s1[i] ;i++)
  36. if(i!=x)
  37. s2[p++]=s1[i] ;
  38. s2[p++]='\0' ;
  39. }
  40. void tran(char *s1,char *s2,int i,int flag,char ch)
  41. {
  42. if(!flag) change(s1,s2,i,ch) ;
  43. else if(flag==1) add(s1,s2,i,ch) ;
  44. else del(s1,s2,i) ;
  45. }
  46. int binary_search(int le,int rt,char *str) // 二分
  47. {
  48. int mid ;
  49. while(le<rt)
  50. {
  51. mid=(le+rt)/2 ;
  52. if(!strcmp(s[mid],str)) return mid ;
  53. else strcmp(s[mid],str)>0 ? rt=mid : le=mid+1 ;
  54. }
  55. return -1 ;
  56. }
  57. void work()
  58. {
  59. int ans=0 ;
  60. memset(dp,0,sizeof(dp)) ;
  61. for(int i=0 ;i<n ;i++)
  62. {
  63. dp[i]=1 ;
  64. int len=strlen(s[i]) ;
  65. for(int t=0 ;t<3 ;t++) // 枚举每一种情况
  66. {
  67. for(int j=0 ;j<=len ;j++)
  68. {
  69. if(j==len&&t!=1) continue ;
  70. for(int k=0 ;k<26 ;k++)
  71. {
  72. tran(s[i],str,j,t,k+'a') ;
  73. if(strcmp(s[i],str)<0) break ;
  74. int mx=binary_search(0,i,str) ;
  75. if(mx!=-1)
  76. dp[i]=max(dp[i],dp[mx]+1) ;
  77. }
  78. }
  79. }
  80. ans = max(ans,dp[i]) ;
  81. }
  82. cout<<ans<<endl ;
  83. }
  84. int main()
  85. {
  86. n=0 ;
  87. while(cin>>s[n++]) ;
  88. n-- ;
  89. work() ;
  90. return 0 ;
  91. }


文章来源: blog.csdn.net,作者:Linux猿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nyist_zxp/article/details/38146259

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。