uva 10026 Problem C: Edit Step Ladders

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=970

通过对每一个字符串,每一个位置进行枚举三个操作,然后二分查找操作后的字符串是否存在,dp记录。

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <algorithm>
  4 #define N 25000
  5 using namespace std;
  6
  7 char g[N][30];
  8 char s[30];
  9 int dp[N*10];
 10
 11 void change(char *g,char *s,int pos,char ch)
 12 {
 13     int k=strlen(g);
 14     for(int i=0; i<k; i++)
 15     {
 16         s[i]=g[i];
 17     }
 18     s[pos]=ch;
 19     s[k]=‘\0‘;
 20 }
 21
 22 void add(char *g,char *s,int pos,char ch)
 23 {
 24     int k=strlen(g);
 25     for(int i=0; i<pos; i++)
 26     {
 27         s[i]=g[i];
 28     }
 29     s[pos]=ch;
 30     for(int j=pos; j<k; j++)
 31     {
 32         s[j+1]=g[j];
 33     }
 34     s[k+1]=‘\0‘;
 35 }
 36
 37 void del(char *g,char *s,int pos)
 38 {
 39     int k=strlen(g);
 40     for(int i=0; i<pos; i++)
 41     {
 42         s[i]=g[i];
 43     }
 44     for(int j=pos+1; j<k; j++)
 45     {
 46         s[j-1]=g[j];
 47     }
 48     s[k-1]=‘\0‘;
 49 }
 50
 51
 52 void Get_change(char *g,char *s,char ch,int pos,int f)
 53 {
 54     if(f==1) change(g,s,pos,ch);
 55     else if(f==2) add(g,s,pos,ch);
 56     else if(f==3) del(g,s,pos);
 57 }
 58
 59 int bs(char *s,int r)
 60 {
 61     r--;
 62     int l=0;
 63     int mid;
 64     while(l<=r)
 65     {
 66         mid=(l+r)>>1;
 67         if(strcmp(g[mid],s)==0)
 68         {
 69             return mid;
 70         }
 71         else if(strcmp(g[mid],s)<0)
 72         {
 73             l=mid+1;
 74         }
 75         else
 76         r=mid-1;
 77     }
 78     return -1;
 79 }
 80 int main()
 81 {
 82     //freopen("1.txt","r",stdin);
 83     //freopen("2.txt","w",stdout);
 84     int cnt=0;
 85     while(gets(g[cnt]))
 86     {
 87         cnt++;
 88     }
 89     int ans=0;
 90     for(int i=0; i<cnt; i++)
 91     {
 92         dp[i]=1;
 93         for(int k=1; k<=3; k++)
 94         {
 95             for(int j=0; j<(int)strlen(g[i]); j++)
 96             {
 97                 for(int c=0; c<26; c++)
 98                 {
 99                     Get_change(g[i],s,‘a‘+c,j,k);
100                     if(strcmp(g[i],s)<0) break;
101                     int x=bs(s,i);
102                     if(x>=0) dp[i]=max(dp[i],dp[x]+1);
103                 }
104             }
105
106         }
107         ans=max(ans,dp[i]);
108     }
109     printf("%d\n",ans);
110     return 0;
111 }

时间: 2024-11-25 06:45:04

uva 10026 Problem C: Edit Step Ladders的相关文章

UVA - 10029 Edit Step Ladders (二分+hash)

Description Problem C: Edit Step Ladders An edit step is a transformation from one word x to another word y such that x and y are words in the dictionary, and x can be transformed to y by adding, deleting, or changing one letter. So the transformatio

POJ - 2564 Edit Step Ladders

题意:题目按字典序给你多个字符串,判断如果一个字符串通过加,减,变一个字母的情况下可以变成另一个字符串的话,就代表他们之间有一个阶梯,求最多的阶梯 思路:首先我们应该想到这个有点LIS的感觉,然后我们可以采用记忆化搜索,然后就是每当一个字符串进行相应的变化后就去查找后面是否有这个字符串,依次找下去,判断最大值,重点是要通过HASH来优化 #include <iostream> #include <cstdio> #include <cstring> #include &

UVA10029 - Edit Step Ladders(LIS)

题目大意:UVA10029 - Edit Step Ladders(LIS) 题目大意:给你一个按照字典序读入的单词,然后要求你找出最长的序列,要求这个最长的序列也要满足字典序,并且后一个是由前一个单词,由在任意的地方替换,增加,删除一个字符变换来的. 解题思路:LIS.但是这里的O(n^2) 25000,超时.但是查找符合的单词有个规律,符合变换要求的单词的长度是有要求的,必须相差小于等于1.并且数据中相同长度的单词不会超过45个,那么就可以把这些单词按照长度分类,那么查找的时候就是45 *

UVA 10029 Edit Step Ladders ——(DAG求最长路)

题意:升序的给出一本若干个单词,每个单词都可删除一个字母,添加一个字母或者改变一个字母,如果任意一个操作以后能变成另外一个字典中的单词,那么就连一条有向边,求最长的长度. 分析:DAG的最长路和最短路在算法竞赛入门里边原原本本有的,结果我现在忘记了,,真是太弱了..方法就是,用map对应键值(以建图),然后删除操作和修改操作可以看做同一个操作,之后每个操作都是在相应的位置添加一个 '*' 就可以了.想说的有两点,一个是为什么删除和修改可以看做一个操作,其实删除这个操作根本就是多余的,因为一个单词

uva 10026 Shoemaker&#39;s Problem(贪心+排序)

虽然是个水题,但是在一些细节上wa了几次,好像不支持'\b'退格符号,我用在了输出空格那,结果wa了...白白 wa了几次...题意是看的题解..今天只写了两道题,速度有点慢,得加快了,以后得先认真读懂题目,题目读懂了 就相当于做出来一半然后仔细动脑想想,有想法了再敲,不能盲目的做题.另外,热烈祝贺今天c++ primer看到 了100页 思路: 这道题是让给的数据是每件工作需要做的天数和每耽误一天所需要的费用,让求一个序列使得付费最小,如果有相同答 案把字典树最小的输出...输出的是序号,该件

UVa 10026 - Shoemaker&#39;s Problem

题目:一个鞋匠接到很多任务,每个任务有一个完成需要时间,延期的任务每天会有一个罚款, 现在所有任务都延期了,问最少的罚款是多少(每天只能做一种工作). 分析:贪心.转化问题为,如果不做则罚款的数额是days*Σ(每个任务罚款): 而每做好一个就认为从这一天开始以后每天都会获得相应的罚款的收益: 求收益的最大值即可,这里按性介比排序即可. 命题:按性介比排序受益最大. 证明:价值为p[i],耗时为c[i]则: 1.如果只有两个任务则有p[i]/c[i] > p[j]/c[j]  ->  p[i]

UVA 10026 Shoemaker&amp;#39;s Problem

Shoemaker's Problem Shoemaker has N jobs (orders from customers) which he must make. Shoemaker can work on only one job in each day. For each ith job, it is known the integer Ti (1<=Ti<=1000), the time in days it takes the shoemaker to finish the jo

重新postgresql出现错误:Problem running post-install step. Installation may not complete correctly. The database cluster initialisation failed.

以下内容是自己重装后一直出现上述问题,在博客园里面找到的解决办法,然而按照本方法还是没能解决问题,终于在最后解决了,傻瓜式错误,再次提示下:请关闭杀毒软件和防火墙. 以前正常使用的postgresql,今天出现问题:报*.dll错误.百度了一下,只能重新安装 . 在重新安装过程中报:Problem running post-install step. Installation may not complete correctly. The database cluster initialisat

uva 10032 Problem F: Tug of War

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=973 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define ll long long 5 using namespace std; 6 7 int w[5000];