NYOJj17-单调递增最长子序列-(dp)
17-单调递增最长子序列
内存限制:64MB 时间限制:3000ms 特判: No
通过数:125 提交数:259 难度:4
题目描述:
求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4
如:dabdbf最长递增子序列就是abdf,长度为4
输入描述:
第一行一个整数0<n<20,表示有n个字符串要处理 随后的n行,每行有一个字符串,该字符串的长度不会超过10000
输出描述:
输出字符串的最长递增子序列的长度
样例输入:
3 aaa ababc abklmncdefg
样例输出:
1 3 7
#include<stdio.h> #include<algorithm> #include<iostream> #include<vector> #include<string> #include<stack> #include<set> #include<queue> #include<cstring> #define inf 0x3f3f3f3f #define ll long long using namespace std; int t; char a[10086]; int dp[10086]; int main()///nyoj17 单调递增最长子序列 lcs { scanf("%d",&t); while(t--) { memset(dp,0,sizeof(dp));///一开始 都是0 scanf("%s",a); int len=strlen(a); int maxx=0; for(int i=0;i<len;i++) { maxx=0;///表示当前i个字符的中 最大的lcs 把前面的j个遍历一下,只为找到最大的那一个 for(int j=0;j<i;j++) { if( a[j]<a[i] && maxx<dp[j]) ///如果第i个字符 大于 前面的第j个字符 则表明dp[i]一定要比dp[j]大,先把前面的dp[j]的最大值给maxx, maxx=dp[j]; } dp[i]=maxx+1;///最后+1,表示dp[i] 比 前面的dp[j]中的最大值 多一个上升子序列 } sort(dp,dp+len);///不一定是最后一个最大,排序找到最大值 printf("%d\n",dp[len-1]); } return 0; }