题目描述:
求一个字符串的最长递增子序列的长度
如:
输入描述:
第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000
输出描述:
输出字符串的最长递增子序列的长度
样例输入:
3
aaa
ababc
abklmncdefg
样例输出:
1
3
7
思路都是一样的。。只不过,,字符之间也可以进行比较啊
思路分析:
①、要求整体的最大长度,我们可以从局部的最大长度来考虑;
②、从左到右依次考虑,每遇到一个点就从第一位开始遍历到该点,看以这个点作为前缀是否为最大值
③、状态方程:dp[i] = max(dp[i], d[j] + 1);
步骤:
①、从左到右依次遍历每一个点;
②、在该点基础上再从前到后通过 dp[i] = max(dp[i], d[j] + 1) 得出该点最大的值
代码:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN=10005;
int main()
{
int t;
cin>>t;
while(t--)
{
char s[MAXN];
cin>>s;
int len=strlen(s),ans=-0x3f3f3f3f,dp[MAXN];
for(int i=0;i<len;i++)
{
dp[i]=1;
for(int j=0;j<i;j++)
{
if(s[j]<s[i])
dp[i]=max(dp[i],dp[j]+1);
ans=max(ans,dp[i]);
}
}
cout<<ans<<endl;
}
return 0;
}