算法:动态规划
描述
求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4
输入
第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000
输出
输出字符串的最长递增子序列的长度
样例输入
3
aaa
ababc
abklmncdefg
样例输出
1
3
7
来源
经典题目
上传者
iphxer
代码:
/*单调递增最长子序列
时间复杂度n*n
#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
#include <iomanip>
using namespace std;
int dp[10005];
int main()
{
string st;
int i,j,k,m,n;
cin>>n;
while(n--)
{
cin>>st;
memset(dp,0,sizeof(dp));
int ans=0;
for(i=1;i<st.size();i++)
{
dp[1]=1;//初值
for(j=i-1;j>=0;j--)
if(st[i]>st[j])
dp[i]=max(dp[i],dp[j]+1);
ans=max(ans,dp[i]);
}
cout<<ans<<endl;
}
return 0;
} */
/*单调递增最长子序列
复杂度n*log(n);二分查找+dp;
#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
#include <iomanip>
#include <cmath>
#include <stdio.h>
using namespace std;
char dp[10005];
int len;
string st;
int serch(int x)
{
int i,j,k;
int left =0;
int right=len;
while(left<=right)
{
int mid=(right+left)/2;
if(dp[mid]==st[x]) return mid;
else if(dp[mid]>st[x])
right=mid-1;
else left=mid+1;
}
return left;
}
int main()
{
int n,i,j,k,m;
scanf("%d",&n);
while(n--)
{
cin>>st;
dp[0]=st[0];
len=0;
for(i=1;i<st.size();i++)
{
k=serch(i);
dp[k]=st[i];
if(k>len) len=k;
}
printf("%d\n",len+1);
}
return 0;
}
*/