您的位置:首页 > 编程语言 > C语言/C++

单调递增最长子序列(NYOJ 17)

2014-11-14 00:42 369 查看
求一个字符串的最长递增子序列的长度

如: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
;
char s
;

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
;
char ans
;
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
,ans
;

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++