南阳17(单调递增最长子序列)

单调递增最长子序列

时间限制:3000 ms  |  内存限制:65535 KB
难度:4
 
描述
求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4
 
输入
第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000
输出
输出字符串的最长递增子序列的长度
样例输入
3
aaa
ababc
abklmncdefg
样例输出
1
3
7
 1 #include<stdio.h>
 2 #include<string.h>
 3 int main()
 4 {
 5     int n;
 6     scanf("%d",&n);
 7     while(n--)
 8     {
 9         char str[10000];
10         int i,j,max,len,dp[10000];
11         scanf("%s",str);
12         len=strlen(str);
13         for(i=0;i<len;i++) //memset函数只可对(int)型数组赋初值 0 和-1; 
14         dp[i]=1;
15         for(i=1;i<len;i++)//核心部分; //不是很理解,但经过手算正确;
16         {
17             for(j=0;j<i;j++)
18             {
19                 if(str[i]>str[j]&&dp[i]<dp[j]+1)
20                 dp[i]=dp[j]+1;
21             } 
22         }
23         max=dp[0];
24         for(i=1;i<len;i++)
25         {
26             if(dp[i]>max)
27             max=dp[i]; 
28          } 
29          printf("%d
",max);
30     } 
31     return 0;
32 }

//另外需要注意的是,memset函数是逐字节进行填充,所以a一般为char *型。对于其它类型的a,可以填充的值有两个,0和-1。因为计算机中用二进制补码表示数字,0和二进制补码为全0,-1的二进制补码为全1

原文地址:https://www.cnblogs.com/soTired/p/4549084.html