动态规划解最长升序子串问题

一、题目重述
 
【问题描述】输入一行字符串,该字符串只由小写英文字母a-z组成,且其中的字符可以重复,最长不超过10000个字符。
 从该字符串中按顺序挑选出若干字符(不一定相邻)组成一个新串,称为“子串”。如果子串中每两个相邻的字符或者相等,或者后一个比前一个大,则称为“升序子串”。编程求出输入字符串的最长升序子串的长度。
 例如,由输入字符串abdbch可以构成的升序子串有:abd、abch、bbch、abbch等。其中最长的升序子串是abbch,其长度为5。
 【输入形式】从标准输入读取一行字符串,该串不含空格,以回车符结束。
 【输出形式】向标准输出打印一个正整数,是字符串中最长的升序子串的长度,在行末要输出一个回车符。
 【输入样例】abdbch
 【输出样例】5
 【样例说明】abdbch中最长子串是abbch,长度是5。
 【评分标准】结果完全正确得20分,每个测试点4分。上传c语言源程序为up.c。
 
二、算法介绍

    这道题大家都不太会做这个可以理解,当年我也没独立地做出来这道题。
    我们可以想象,如果能过穷举所有可能的子串,然后找出最大的那个不就可以了吗?假设我们的字符串有n个字符,那么所有的子串就有2^n那么多,也就是说穷举的时间复杂度是O(2^n),找最大值可以在穷举的过程中顺便进行,所以这个算法的时间复杂度就是O(2^n)。相信你一定可以想象,这个时间复杂度是十分糟糕的。
    说到这里,提一下“NP完全问题”。无论是通过理论还是通过实验,我们都发现对于一个指数时间复杂度的算法,即使是问题规模比较小的情况下也需要相当长的时间来求解,并且随着问题规模的增长,这个时间会飞速的上升
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值