单调递增最长子序列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单调递增最长子序列相关的知识,希望对你有一定的参考价值。

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

 

技术分享
 1  #include <assert.h>
 2 #include <error.h>
 3 #include <unistd.h>
 4 #include <sys/types.h>
 5 #include <signal.h>
 6 #include <pthread.h>
 7 #include <stdio.h>
 8 #include <unistd.h>
 9 #include <stdlib.h>
10 #include <pthread.h>
11 #include <string.h>
12 int dep[10000];
13 int max(int a, int b){
14     return (a>b)?a:b;
15 }
16 
17 //aesc
18 int cmp(const void*a, const void *b){
19     return *((int *)a)>*((int *)b)?0:1;
20 }
21 
22 int dp(char *buf, int len){
23     int i,j;
24     int tmp=0;
25     int k;
26     for (k = 0; k < 10000; ++k) {
27         dep[k] = 1;
28     }
29     for (i = 0; i < len; ++i) {
30         for (j = 0; j < i; ++j) {
31             if (buf[i] > buf[j]) {
32                 dep[i] = max(dep[j]+1, dep[i]);
33             }
34         }
35     }
36 
37     qsort(dep, len, sizeof(int), cmp);
38     tmp = dep[0];
39 
40     /*
41     for (k = 0; k < len; ++k) {
42         printf("%d ", dep[k]);
43     }
44     printf("\n");
45 
46     for (k = 0; k < 10000; ++k) {
47         if(dep[k] > tmp){
48             tmp = dep[k];
49         }
50     }*/
51     return tmp;
52 }
53 
54 int main(){
55     int n;
56     scanf("%d", &n);
57     getchar();
58     while (n--) {
59         char buf[10000] = {0};
60         scanf("%s", buf);
61         getchar();
62        int len = (int)strlen(buf);
63        int max = dp(buf, len);
64         printf("%d\n", max);
65     }
66     exit(EXIT_SUCCESS);
67 }
68         
View Code

 

以上是关于单调递增最长子序列的主要内容,如果未能解决你的问题,请参考以下文章

JAVA动态规划,最长递增子序列的代码太难理解,求大神帮我讲解一下!

NYOJ 17 单调递增最长子序列

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

求单调递增最长子序列长度

动态规划 - 单调递增最长子序列

单调递增最长子序列