您的位置:首页 > 其它

AOJ 189 最长递增子序列(DP)

2012-04-08 16:39 323 查看


单调递增最长子序列

描述

求一个字符串的最长递增子序列的长度

如: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的风格啊




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
为末元素的所有递增子序列 中长度最长的列的长度
{
    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

    for(i = 1; i < n; i++) {
        if( array[i] < array
 && aMaxlen[i] > maxlen_i )
            maxlen_i = aMaxlen[i];
    }
    if( maxlen_i == 0 )                     //  maxlen_i没变,则array
最小(前面找不到比它小的)
        return 1;                           //  故以array
为末元素的递增子序列就是它自己
    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
 = Maxlen(N);
        cout << SearchMax(N) << endl;
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: