单调递增最长子序列(动态规划)
Posted geziyu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单调递增最长子序列(动态规划)相关的知识,希望对你有一定的参考价值。
单调递增最长子序列
题目描述:
求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4
如: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; }
以上是关于单调递增最长子序列(动态规划)的主要内容,如果未能解决你的问题,请参考以下文章