(这算是经典的DP题型了,我竟然差点忘记了,罪不应该啊。)
描述
求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4
如:dabdbf最长递增子序列就是abdf,长度为4
输入
第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000
随后的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;
}
这些就是核心代码。 如果想不通, 反复思考下。
首先就得弄清楚这是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;
}
这些就是核心代码。 如果想不通, 反复思考下。