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

单调递增最长子序列

 
描述
求一个字符串的最长递增子序列的长度
如: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[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;
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值