您的位置:首页 > 其它

NYOJ 17 单调递增最长子序列

2013-04-19 14:23 204 查看


单调递增最长子序列

时间限制:3000 ms  |  内存限制:65535 KB
难度:4

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

如:dabdbf最长递增子序列就是abdf,长度为4

输入第一行一个整数0<n<20,表示有n个字符串要处理

随后的n行,每行有一个字符串,该字符串的长度不会超过10000
输出输出字符串的最长递增子序列的长度
样例输入
3
aaa
ababc
abklmncdefg


样例输出
1
3
7


#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <string>
#include <vector>
#include <cstdio>
#include <cmath>
#include <map>
#define FLAG 0
using namespace std;
char s[10005];
int mx,maxi;
int f[10005];
int main()
{
#if(FLAG)
freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
#endif
int n,i,j,len,t;
scanf("%d",&n);
while(n--)
{
scanf("%s",s);
len=strlen(s);
memset(f,0,sizeof(f));
maxi=0;
for(i=1;i<len;i++)//动态规划问题,从第二个起遍历整个字符串,拿s[i]与他
{                   //前面的i个字符相比较,f[i]表示把
mx=0;           //当前字符加到前i个字符的任意一个后面的所有情况中
for(j=0;j<i;j++)//能组成的最优(最长)的字符串长度;
{
if(s[i]>s[j]&&mx<f[j]+1)
{
mx=f[j]+1;//循环找到最长的长度
}
}
f[i]=mx;//把最长长度赋给f[i];
if(mx>maxi)maxi=mx;
}
cout<<maxi+1<<endl;
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  NYOJ