#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;
}
单调递增最长子序列
时间限制:3000 ms | 内存限制:65535 KB
难度:4
- 描述
- 求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4
- 输入
- 第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000 输出 - 输出字符串的最长递增子序列的长度 样例输入
3 aaa ababc abklmncdefg
样例输出1 3
7
#include <cstdio> #include <cstring> const int maxn=10001; char s[maxn]; int dp[maxn],Max; void LICS() { int len; memset(dp,0,sizeof(dp)); len=strlen(s); for(int i=0;i<len;i++) { dp[i]=1;//给定一个数组求的时候,初始值就是1,一个数组的最大序列肯定会有一个字符; for(int j=0;j<i;j++) { if(s[i]>s[j] && dp[i]<1+dp[j])// 递推公式,如果这个位置比前面的字符都大,就加入到递增序列中来 dp[i]=1+dp[j]; } } Max=0; for(int i=0;i<len;i++)//求出最大值 if(Max<dp[i]) Max=dp[i]; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%s",s); LICS(); printf("%d\n",Max); } return 0; }