poj 2564 Edit Step Ladders TRIE树+dp求图中最长路
2015-10-10 18:22
387 查看
//poj 2564 //sep9 #include <iostream> using namespace std; const int MAXN=25000; int n,idx; char tmp[20],s[MAXN+10][20]; int dp[MAXN+10]; struct TRIE { int c[27]; bool vis; int ids; }a[8*MAXN+10]; void insert(char ss[],int u) { int i=0,h=0; while(ss[i]!='\0'){ int t=ss[i]-'a'; if(a[h].c[t]==0) a[h].c[t]=++idx; h=a[h].c[t]; ++i; } a[h].vis=true; a[h].ids=u; } int find(char ss[]) { int i=0,h=0; while(ss[i]!='\0'){ int t=ss[i]-'a'; if(a[h].c[t]==0) return -1; h=a[h].c[t]; ++i; } if(a[h].vis==true) return a[h].ids; return -1; } void add(char ss[],int i,int d) { int p=0,q=0; while(p<i) tmp[q++]=ss[p++]; tmp[q++]=d+'a'; while(ss[p]) tmp[q++]=ss[p++]; tmp[q]='\0'; } void del(char ss[],int i) { int p=0,q=0; while(p<i) tmp[q++]=ss[p++]; ++p; while(ss[p]) tmp[q++]=ss[p++]; tmp[q]='\0'; } void trans(char ss[],int i,int d) { strcpy(tmp,ss); tmp[i]=d+'a'; } int rec(int u) { if(dp[u]!=-1) return dp[u]; int ans=0,len=strlen(s[u]); for(int i=0;i<=len;++i) for(int d=0;d<26;++d){ add(s[u],i,d); int v; v=find(tmp); if(v!=-1&&strcmp(s[u],tmp)<0) ans=max(ans,rec(v)+1); } for(int i=0;i<len;++i){ del(s[u],i); int v=find(tmp); if(v!=-1&&strcmp(s[u],tmp)<0) ans=max(ans,rec(v)+1); } for(int i=0;i<len;++i) for(int d=0;d<26;++d){ trans(s[u],i,d); int v=find(tmp); if(v!=-1&&strcmp(s[u],tmp)<0) ans=max(ans,rec(v)+1); } return dp[u]=ans; } int main() { memset(a,0,sizeof(a)); idx=0; n=0; while(scanf("%s",s )!=EOF) insert(s ,n),++n; memset(dp,-1,sizeof(dp)); int ans=0; for(int i=0;i<n;++i) ans=max(ans,rec(i)); printf("%d",ans+1); return 0; }
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#获取关键字附近文字算法实例