标题:单调递增最长子序列
只看楼主
weipeng1217
Rank: 5Rank: 5
等 级:职业侠客
帖 子:175
专家分:386
注 册:2012-1-12
结帖率:77.78%
已结贴  问题点数:20 回复次数:9 
单调递增最长子序列

单调递增最长子序列


难度:4

描述 求一个字符串的最长递增子序列的长度
 如:dabdbf最长递增子序列就是abdf,长度为4
输入第一行一个整数0<n<20,表示有n个字符串要处理
 随后的n行,每行有一个字符串,该字符串的长度不会超过10000输出输出字符串的最长递增子序列的长度

样例输入
3
aaa
ababc
abklmncdefg

样例输出
1
3
7
搜索更多相关主题的帖子: 字符串 长子 
2012-02-02 23:00
weipeng1217
Rank: 5Rank: 5
等 级:职业侠客
帖 子:175
专家分:386
注 册:2012-1-12
得分:0 
盯了一天,愣是没整出来。。

C坛友交流群 群号:161091913 ,欢迎经常在线的朋友加入,一起学习,一起进步。。
2012-02-02 23:01
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
又是南洋理工的题,想看代码还是想听算法?
这题的做法不止一种,不过看起来目前我的代码是关于这题你们学校最短的、占用内存最少的、速度最快的
排名 运行号  用户        时间 内存 长度 语言  提交时间
1    112610  beyondyf(1) 0    228  318  C/C++ 02-03 08:00:16

重剑无锋,大巧不工
2012-02-03 08:17
hnuhsg1226
Rank: 9Rank: 9Rank: 9
来 自:中国
等 级:蜘蛛侠
威 望:2
帖 子:314
专家分:1314
注 册:2011-3-27
得分:0 
斑竹给算法吧

我的地盘
2012-02-03 10:03
BianChengNan
Rank: 8Rank: 8
等 级:贵宾
威 望:13
帖 子:302
专家分:972
注 册:2011-11-30
得分:0 
以下是引用beyondyf在2012-2-3 08:17:20的发言:

又是南洋理工的题,想看代码还是想听算法?
这题的做法不止一种,不过看起来目前我的代码是关于这题你们学校最短的、占用内存最少的、速度最快的
版主威武,期待分析加代码。。。
不过题目我好像没理解,感觉题目的例子不对。。。

描述 求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4 // 这个怎么会是4?应该是3 对应的最常字串 是abd (难道可以不连续?)


[ 本帖最后由 BianChengNan 于 2012-2-3 10:20 编辑 ]

我的群:149544757 C/C++/Assembly 喜欢交流的朋友进,进群请写消息
2012-02-03 10:18
weipeng1217
Rank: 5Rank: 5
等 级:职业侠客
帖 子:175
专家分:386
注 册:2012-1-12
得分:0 
回复 3楼 beyondyf
哇。。我越来越崇拜你了。。

C坛友交流群 群号:161091913 ,欢迎经常在线的朋友加入,一起学习,一起进步。。
2012-02-03 11:34
weipeng1217
Rank: 5Rank: 5
等 级:职业侠客
帖 子:175
专家分:386
注 册:2012-1-12
得分:0 
回复 5楼 BianChengNan
没有说要连续啊,b和d还不连续呢,只要单调递增就行

C坛友交流群 群号:161091913 ,欢迎经常在线的朋友加入,一起学习,一起进步。。
2012-02-03 11:35
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
我怎么觉得abklmncdefg

的单调递增长度是6?
abklmn不是6个吗 难道后面的c也算个?

梅尚程荀
马谭杨奚







                                                       
2012-02-03 12:11
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:20 
先回复楼上,abcdefg的长度是7。

再说这个题的解法。只是我的思路,别人可能有不同的解法,欢迎交流。
设串的字符集为S,包含N个元素,每个元素为Ak,Ai < Aj (0 <= i < j < N)。
设串T中以Ap结尾的单调递增子序列长度为len(T, Ap),则T的单调递增子序列长度为Maxlen(T) = max(len(T,A0), len(T, A1), ..., len(T,An-1))。
如果给串T的末尾再添加一个字符Aq,则len(T + Aq, Aq) = len(T, Aq - 1) + 1。
由上面的关系可以构造出求串T的单调递增最长子序列的DP算法。在给定的字符集下,该算法的时间复杂度为O(N)。

说起来很抽象,上代码。
程序代码:
#include<stdio.h>
int length(char * s)
{
    int len[128] = {0}, i, t;
    for(; *s != '\0' && (t = len[*s - 1] + 1); s++)
    for(i = *s; i < 128 && len[i] < t; len[i++] = t);
    return len[127];
}
int main()
{
    int n;
    char s[10001];
    for(scanf("%d\n", &n); n--;)
    printf("%d\n", length(gets(s)));
    return 0;
}

重剑无锋,大巧不工
2012-02-03 12:46
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
我理解成连续单调递增长度了。

梅尚程荀
马谭杨奚







                                                       
2012-02-03 13:28



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-360317-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 1.251105 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved