题目描述:
求一个字符串的最长递增子序列的长度
如:
输入描述:
第一行一个整数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;
}
03-05 00:16