单调递增最长子序列
描述
-
求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4-
输入
-
第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000
输出
- 输出字符串的最长递增子序列的长度 样例输入
-
3 aaa ababc abklmncdefg
样例输出
-
1 3 7
Accepted
#include<stdio.h> int length(char * s) { int len[128] = {0}, i, t; for(; *s != '\0' && (t = len[*s - 1] + 1); s++) for(i = *s; i < 128 && len[i] < t; len[i++] = t); return len[127]; } int main() { int n; char s[10001]; for(scanf("%d\n", &n); n--;) printf("%d\n", length(gets(s))); return 0; }
还待好好研究研究。有IOCCC的风格啊
-
第一行一个整数0<n<20,表示有n个字符串要处理
2、http://icpc.ahu.edu.cn/OJ/Problem.aspx?id=189
#include <iostream>
#include <cstring>
using namespace std;
#define MAXNUM 7005
int aMaxlen[MAXNUM]; // aMaxlen[]是备忘录
unsigned int array[MAXNUM];
unsigned int Maxlen(const int n) // Maxlen(n)是 以array[n]为末元素的所有递增子序列 中长度最长的列的长度
{
if( n == 1 )
return 1;
int i;
for(i = 1; i < n; i++) {
if (aMaxlen[i] == -1)
aMaxlen[i] = Maxlen(i);
}
int maxlen_i = 0; // maxlen_i是以array[i]为末元素的递增子序列中长度最长的列的长度,且array[i] < array[n]
for(i = 1; i < n; i++) {
if( array[i] < array[n] && aMaxlen[i] > maxlen_i )
maxlen_i = aMaxlen[i];
}
if( maxlen_i == 0 ) // maxlen_i没变,则array[n]最小(前面找不到比它小的)
return 1; // 故以array[n]为末元素的递增子序列就是它自己
return maxlen_i + 1;
}
int SearchMax(int size)
{
int max = 0;
for (int i = 1; i <= size; i++) {
if (aMaxlen[i] > max)
max = aMaxlen[i];
}
return max;
}
int main(void)
{
// freopen("cin.txt", "r", stdin);
int N;
while(cin >> N)
{
memset(aMaxlen, -1, sizeof(aMaxlen));
for(int i = 1; i <= N; i++)
cin >> array[i];
aMaxlen[N] = Maxlen(N);
cout << SearchMax(N) << endl;
}
return 0;
}