1. 程式人生 > >單調遞增最長子序列(動態規劃)

單調遞增最長子序列(動態規劃)

單調遞增最長子序列

題目描述:

求一個字串的最長遞增子序列的長度
如: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\n",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\n",ans);
    }
    return 0;
}