单调递增最长子序列(动态规划)

单调递增最长子序列

题目描述:

求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4

输入描述:

第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000

输出描述:

输出字符串的最长递增子序列的长度

样例输入:

3
aaa
ababc
abklmncdefg

样例输出:

1
3
7
AC代码:
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 char s[10005];
 6 int dp[10005];
 7 int main()
 8 {
 9     int t;
10     scanf("%d",&t);
11     while(t--)
12     {
13         scanf("%s",s);
14         int len=strlen(s);
15         memset(dp,0,sizeof(dp));
16       
17         for(int i=0;i<len;i++)
18         {
19             dp[1]=1;
20             for(int j=0;j<i;j++)
21             {
22                 if(s[i]>s[j]) 
23                 dp[i]=max(dp[i],dp[j]+1);
24             }
25         }
26         sort(dp,dp+len);
27         printf("%d
",dp[len-1]);
28     }
29     return 0;
30 }
显示答案错误:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

char str[10005],a[10005];
int dp[10005];

int main(){
    int n;
    scanf("%d",&n);
    while( n-- ){
        scanf("%s",a);
        int len = strlen(a);
        for( int i = 0; i < len; i++ )
            str[i+1] = a[i];
        dp[1] = 1;
        for( int i = 2; i <= len; i++ ){
            dp[i] = 0;
            for( int j = 1; j <= len; j++ ){
                if( str[i] > str[j] )
                    dp[i] = max(dp[i],dp[j]+1);
            }
        }
        int ans = 0;
        for( int i = 1; i <= len; i++ )
            ans = max(ans,dp[i]);
        printf("%d
",ans);
    }
    return 0;
}












原文地址:https://www.cnblogs.com/geziyu/p/10045816.html