單調遞增最長子序列(動態規劃)
阿新 • • 發佈:2018-11-30
單調遞增最長子序列
題目描述:
求一個字串的最長遞增子序列的長度如: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; }