单调递增最长子序列

单调递增最长子序列

时间限制:3000 ms  |  内存限制:65535 KB
难度:4
描述
求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4
输入
第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000
输出
输出字符串的最长递增子序列的长度
样例输入
3
aaa
ababc
abklmncdefg
样例输出
1
3
7
来源
经典题目
上传者

iphxer


dp[i]表示前i个字符串时候最长递增子序列长度。则取局部最优,动态规划

#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <string>
using namespace std;

#define mem(a) memset(a, 0, sizeof(a))

char a[10100];
int dp[10100];

int main() {
	int n;
	cin >> n;
	while (n --) {
		mem(a);	mem(dp);
		cin >> a;
		int ans = 1, p = strlen(a);
		//for (int i = 0; i<p; i++)	dp[i] = 1;
		dp[0] = 1;
		for (int i = 1; i<p; i++) {
			int Max = 0;
			for (int j = i-1; j>=0; j--) {
				if (a[i] > a[j] && Max < dp[j])	Max = dp[j];
			}
			dp[i] = Max + 1;
			if (dp[i] > ans)	ans = dp[i];
		}
		cout << ans << endl;
	}
	return 0;
}


原文地址:https://www.cnblogs.com/Tovi/p/6194795.html