单调递增最长子序列。(详解)

(这算是经典的DP题型了,我竟然差点忘记了,罪不应该啊。)


描述
求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4
输入
第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000
输出
输出字符串的最长递增子序列的长度
样例输入
3
aaa
ababc
abklmncdefg
样例输出
1
3
7
首先就得弄清楚这是DP问题,很明显得DP。开始解题,细心看。
dp[i]表示以i为初始位置的最长递增序列的长度。(a[i]在这个最长序列中)
动态转移方程(自己写的,未免有点挫)dp[e](0<=e<len(数组长度)) =      max( dp[i](e<i<len)  + 1); 其实i就是e的下一位置。
动态转移方程明显可以看到得倒着来。
for(int i=0; i < len; ++i)
dp[i] = 1;( 开头的是i,所以至少是1,初始化就的赋值为1  )。
i = len - 1;不用考虑,绝对是1;
for(int i = len - 2; i >= 0; --i)
for(int e = i+1; e  < len; ++e)(这个正反次序无所谓)
{
if(a[i] < a[e] && a[e] + 1 > a[i]) (a[i] < a[e]是e是i的下一位置的基本条件)(第二个条件是找最大的)
a[i] = a[e] + 1;
}
这些就是核心代码。   如果想不通, 反复思考下。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值