单调递增最长子序列
时间限制: 1 Sec 内存限制: 128 MB提交: 7 解决: 5
[ 提交][ 状态][ 论坛]
题目描述
求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4
输入
第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000
输出
输出字符串的最长递增子序列的长度
样例输入
3aaaababcabklmncdefg
样例输出
137
#include<cstdio>
#include<iostream>
#include<string.h>
using namespace std;
char str1[1005];
int dp[1010];
int seach(int left,int right,int x)
{
if(dp[left]>=x)return left;
while(left<=right){
int mid=(left+right)/2;
if(x<=dp[mid])right=mid-1;
else{
left=mid+1;
if(dp[left]>=x)return left;
}
}
}
int main()
{
int n,m;
cin>>n;
while(n--){
m=0;
getchar();
cin>>str1;
memset(dp,0,sizeof(dp));
int len=strlen(str1);
dp[m=1]=str1[0];
for(int i=1;i<len;i++){
if(str1[i]>dp[m])dp[++m]=str1[i];
else dp[seach(1,m,str1[i])]=str1[i];
}
printf("%d\n",m);
}
return 0;
}
#include<iostream>
#include<string.h>
using namespace std;
char str1[1005];
int dp[1010];
int seach(int left,int right,int x)
{
if(dp[left]>=x)return left;
while(left<=right){
int mid=(left+right)/2;
if(x<=dp[mid])right=mid-1;
else{
left=mid+1;
if(dp[left]>=x)return left;
}
}
}
int main()
{
int n,m;
cin>>n;
while(n--){
m=0;
getchar();
cin>>str1;
memset(dp,0,sizeof(dp));
int len=strlen(str1);
dp[m=1]=str1[0];
for(int i=1;i<len;i++){
if(str1[i]>dp[m])dp[++m]=str1[i];
else dp[seach(1,m,str1[i])]=str1[i];
}
printf("%d\n",m);
}
return 0;
}