动态规划 求字符串的 最长递增子序列 的长度

题目描述:
求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4
输入描述:
第一行一个整数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;
}
border="0" width="0" height="0" src="//music.163.com/outchain/player?type=0&id=2664857217&auto=1&height=0">&#10;
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值