题目描述:
求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4
如:dabdbf最长递增子序列就是abdf,长度为4
输入描述:
第一行一个整数0<n<20,表示有n个字符串要处理 随后的n行,每行有一个字符串,该字符串的长度不会超过10000
输出描述:
输出字符串的最长递增子序列的长度
样例输入:
3 aaa ababc abklmncdefg
样例输出:
1 3 7
#include<bits/stdc++.h> using namespace std; const int inf=0x3f3f3f3f; int dp[10005]; int main() { int T; scanf("%d",&T); while(T--) { char s[10005]; memset(dp,inf,sizeof(dp)); scanf("%s",s); int len=strlen(s); for(int i=0;i<len;i++) { *lower_bound(dp,dp+len,s[i])=s[i]; } printf("%d\n",lower_bound(dp,dp+len,inf)-dp); } return 0; }
这题会控制时间复杂度,所以n*n不行
#include<stdio.h> #include<string.h> int main() { int n; char str[10010]; int dp[30];//英文字母共有26个 scanf("%d",&n); getchar(); while(n--) { memset(dp,0x3f,sizeof(dp));//讲dp数组的每个数据初始为无穷大 int i,len,count=0;//dp数组储存数据的实际长度 gets(str); len=strlen(str); for(i=0;i<len;i++) { int low=0,high=count,mid; while(low<=high)//利用二分查找,找到第一个大于或等于前一个元素的位置(c++中lower_bound) { mid=(low+high)/2; if(dp[mid]>=str[i]) high=mid-1; else low=mid+1; } dp[low]=str[i]; if(low==count) count++; } printf("%d\n",count); } return 0; }