求所给字典中最长递变且字典序升序的单词数
方法和最长上升子序列是一样的,判断的条件由LIS中的大小关系变成是否可递变
#include<stdio.h>
#include<string.h>
#define size 25010
char word[25010][16];
int len[25010];
int dp[25010];
int max(int a,int b)
{
if(a<b)
return b;
else
return 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