如:dabdbf最长递增子序列就是abdf,长度为4
-
输入
-
第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000
输出
输出字符串的最长递增子序列的长度
样例输入
3 aaa ababc abklmncdefg
样例输出
1 3 7
方法一:
#include<iostream>
#include<cstring>
#define N 10010
using namespace std;
int dp[N];
char s[N];
int main()
{
int len,test,i,j,max;
scanf("%d",&test);
while(test--)
{
scanf("%s",&s);
len=strlen(s);
dp[0]=1;
for(i=1;i<len;i++)
{
max=0;
for(j=i-1;j>=0;j--)
{
if(s[i]>s[j]&&max<dp[j])
{
max=dp[j];
}
}
dp[i]=max+1;
}
max=dp[0];
for(i=1;i<len;i++)
if(max<dp[i])
max=dp[i];
printf("%d\n",max);
}
return 0;
}
方法二:
#include<iostream>
#include<cstring>
#define N 10010
using namespace std;
char s[N];
char ans[N];
int count;
int main()
{
int test,len,i,j;
cin>>test;
while(test--)
{
cin>>s;
len=strlen(s);
count=1;
ans[0]=s[0];
for(i=0;i<len;i++)
{
for(j=count-1;j>=0;j--)
{
if(j==0&&ans[0]>s[i]) ans[0]=s[i];
if(ans[j]<s[i])
{
ans[j+1]=s[i];
if(j==count-1) count++;
break;
}
}
}
ans[count]='\0';
// cout<<ans<<endl;
cout<<count<<endl;
}
return 0;
}
方法三:
#include<iostream>
#define N 1010
using namespace std;
char a[N],ans[N];
int work(int n)
{
int i,j,k,s,e,m;
ans[0]=a[0];
k=0;
for(i=1;i<n;i++)
{
if(ans[k]<a[i])
{
k++;
ans[k]=a[i];
continue;
}
s=0;e=k;
while(s<=e)
{
if(a[i]<ans[s])
{
j=s;break;
}
if(ans[e]<a[i])
{
j=e+1;break;
}
m=(s+e)/2;
if(ans[m]<a[i]) s=m+1;
else if(a[i]<ans[m]) e=m-1;
else
{
j=m;break;
}
}
ans[j]=a[i];
}
return k+1;
}
int main()
{
int n,i;
cin>>n;
while(n--)
{
cin>>a;
cout<<work(strlen(a))<<endl;
}
return 0;
}