单调递增最长子序列

来源:互联网 发布:招聘渠道数据分析 编辑:程序博客网 时间:2024/05/07 02:08

单调递增最长子序列

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

iphxer


思路:用一个d数组保存到第从1到m个字符为止的最长递增子序列的长度,当前位置的值,应该取,(在他前面比他小的,单调递增序列的长度加1),和(当前值)的最大值。用两个for循环,一个用来遍历每个元素,给每个元素计算出最大递增子序列的值,嵌套的for循环用来找在他之前的递增子序列,找出最大值加1,跟当前比较,取二者最大值


#include<stdio.h>#include<string.h> int max(int a, int b){return a > b ? a : b;}int main(){int n, i, j, result, len, d[10001];char str[10001];scanf("%d", &n);while(n--){scanf("%s", str);len = strlen(str);for(i = 0; i < len; i++){d[i] = 1;for(j = 0; j < i; j++){if(str[i] > str[j])d[i] = max(d[i], d[j] + 1);}}result = 1;

for(i = 0; i < len; i++){if(d[i] > result)result = d[i];}printf("%d\n", result);}return 0;}

0 0
原创粉丝点击