单调递增最长子序列
- 描述
- 求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4
- 输入
- 第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000 输出 - 输出字符串的最长递增子序列的长度 样例输入
3 aaa ababc abklmncdefg
样例输出1 3
7
#include <cstdio>
#include <cstring>
const int maxn=10001;
char s[maxn];
int dp[maxn],Max;
void LICS()
{
int len;
memset(dp,0,sizeof(dp));
len=strlen(s);
for(int i=0;i<len;i++)
{
dp[i]=1;//给定一个数组求的时候,初始值就是1,一个数组的最大序列肯定会有一个字符;
for(int j=0;j<i;j++)
{
if(s[i]>s[j] && dp[i]<1+dp[j])// 递推公式,如果这个位置比前面的字符都大,就加入到递增序列中来
dp[i]=1+dp[j];
}
}
Max=0;
for(int i=0;i<len;i++)//求出最大值
if(Max<dp[i])
Max=dp[i];
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",s);
LICS();
printf("%d\n",Max);
}
return 0;
}