您的位置:首页 > 其它

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

2013-05-04 17:33 197 查看
(这算是经典的DP题型了,我竟然差点忘记了,罪不应该啊。)

[align=left]描述 [/align]
求一个字符串的最长递增子序列的长度

如:dabdbf最长递增子序列就是abdf,长度为4
[align=left]输入 [/align]
第一行一个整数0<n<20,表示有n个字符串要处理

随后的n行,每行有一个字符串,该字符串的长度不会超过10000
[align=left]输出 [/align]
[align=left]输出字符串的最长递增子序列的长度 [/align]
[align=left]样例输入 [/align]
[align=left]3[/align]
[align=left]aaa[/align]
[align=left]ababc[/align]
[align=left]abklmncdefg[/align]
[align=left]样例输出 [/align]
[align=left]1[/align]
[align=left]3[/align]
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;

}
这些就是核心代码。   如果想不通, 反复思考下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: