nyoj 题目17 单调递增最长子序列

来源:互联网 发布:软件开发 学校 编辑:程序博客网 时间:2024/05/24 02:35


http://acm.nyist.net/JudgeOnline/problem.php?pid=17

单调递增最长子序列

时间限制:3000 ms  |  内存限制:65535 KB
难度:4
描述
求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4
输入
第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000
输出
输出字符串的最长递增子序列的长度
样例输入
3aaaababcabklmncdefg
样例输出
137
#include<stdio.h>#include<string.h>#define MAX 10000int main(){char s[MAX+10];int a[MAX+10],T,n,i,j,k;scanf("%d",&T);while(T--){scanf("%s",s);n=strlen(s);memset(a,0,sizeof(a));for(i=1,a[0]=1,k=0;i<n;i++){//时间复杂度O(n^n) a[i]=1;for(j=i-1;j>=0;j--)//从i前一位i-1往前扫描,扫描第一个比s[i]小的,为s[j],然后a[i]=a[j]+1 if(s[i]>s[j]&&a[i]<=a[j]/*特别注意这里*/){                a[i]=a[j]+1;            }                        if(a[i]>k)//每一次都比较,把最大的存到k中             k=a[i];        }        //for(i=0;i<n;i++)        //printf("%d ",a[i]);        //printf("\n");        if(k==0)//特别注意这里         k+=1;        printf("%d\n",k);     }     return 0; }

0 0