单调递增最长子序列(LIS)【NY】-17

来源:互联网 发布:vb中default是什么意思 编辑:程序博客网 时间:2024/06/05 20:07

点击打开链接

单调递增最长子序列

时间限制:3000 ms  |  内存限制:65535 KB
难度:4
描述
求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4
输入
第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000
输出
输出字符串的最长递增子序列的长度
样例输入
3aaaababcabklmncdefg
样例输出
137
来源
经典题目

解析:LIS的裸题,

代码:

1.O(  n^2  )

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define INF 0x7fffffffconst int maxn=10005;int dp[maxn];char a[maxn];int main(){int t;scanf("%d",&t);while(t--){scanf("%s",a);int l1=strlen(a);int ans=0;for(int i=0;i<l1;i++){dp[i]=1;           //只包含ai的子序列for(int j=0;j<i;j++){if(a[j]<a[i])        //在满足j<i并且aj<ai的以aj为结尾的上升子列末尾,追加上ai后得到的子序列dp[i]=max(dp[i],dp[j]+1);}ans=max(ans,dp[i]);}printf("%d\n",ans);}return 0;} 


2.

O(  nlogn  )

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define INF 0x7fffffffconst int maxn=10005;int dp[maxn];char a[maxn];int main(){    int t;    scanf("%d",&t);    while(t--)    {    scanf("%s",a);    int l1=strlen(a);    fill(dp,dp+l1,INF);    for(int i=0;i<l1;i++)    *lower_bound(dp,dp+l1,a[i])=a[i];    printf("%d\n",lower_bound(dp,dp+l1,INF)-dp);}return 0;}


原创粉丝点击