uva 10029 递变阶梯

来源:互联网 发布:测向定位软件下载 编辑:程序博客网 时间:2024/04/30 10:33

求所给字典中最长递变且字典序升序的单词数

方法和最长上升子序列是一样的,判断的条件由LIS中的大小关系变成是否可递变

#include<stdio.h>#include<string.h>#define size 25010char word[25010][16];int len[25010];int dp[25010];int max(int a,int b){if(a<b)return b;elsereturn a;}void judge(int a,int b){int i,j=0,la,lb,l;la=len[a];lb=len[b];if(la-lb>1||lb-la>1)return ;l=max(la,lb);if(la==lb){for(i=0;i<l;i++){if(word[a][i]!=word[b][i])j++;}if(j==1){if(dp[a]+1>dp[b]){dp[b]=dp[a]+1;}return;}}else if(la==lb+1)//在a里删一个{int del;int k;for(del=0;del<la;del++){k=0;for(i=0;i<del;i++){if(word[a][i]!=word[b][i])k++;}for(i=del+1;i<la;i++){if(word[a][i]!=word[b][i-1])k++;}if(k==1&&dp[a]+1>dp[b]){dp[b]=dp[a]+1;return;}}}else if(la==lb-1){int del;for(del=0;del<lb;del++){int k=0;for(i=0;i<del;i++){if(word[a][i]!=word[b][i])k++;}for(i=del+1;i<lb;i++){if(word[a][i-1]!=word[b][i])k++;}if(k==1&&dp[a]+1>dp[b]){dp[b]=dp[a]+1;return;}}}}int main(){memset(len,-1,sizeof(len));memset(dp,0,sizeof(dp));memset(word,0,sizeof(word));int i=0,j,k=0,l=0,m=-1,n;while(gets(word[k])!=NULL){l=strlen(word[k]);len[k]=l;dp[k]=1;if(k>=1)for(i=k-1;i>=0;i--){judge(i,k);}if(m<dp[k]){m=dp[k];}k++;}printf("%d\n",m);return 0;}
RE

原创粉丝点击