一个C语言的简单问题(需要E文知识)

来源:百度知道 编辑:UC知道 时间:2024/05/17 07:24:36
Problem description
A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (a1, a2, ..., aN) be any sequence (ai1, ai2, ..., aiK), where 1 <= i1 < i2 < ... < iK <= N. For example, sequence (1, 7, 3, 5, 9, 4, 8) has ordered subsequences, e. g., (1, 7), (3, 4, 8) and many others. All longest ordered subsequences are of length 4, e. g., (1, 3, 5, 8).

Your program, when given the numeric sequence, must find the length of its longest ordered subsequence.

Input
The first line of input file contains the length of sequence N. The second line contains the elements of sequence - N integers in the range from 0 to 10000 each, separated by spaces. 1 <= N <= 1000

Output
Output file must contain a single integer - the length of the longest ordered subsequence of the given sequence.

Sample Input
7
1 7 3 5 9 4 8

Sample Output
4

/*作者baihacker
时间:15.12.2006
说明:最大不降串的查找*/
#include <stdio.h>
#include <string.h>

main()
{
char s[256];//目标字符串,由于数字0到9的asc码从小到大排列,所以数字的比较等价于字符的比较
char stk[256];//用来输出的栈
char l[256];//l[i]表示从s[0]到s[i],以s[i]结尾的最大长度
int m[256];//m[i]表示构成s[0]到s[i],以s[i]的最长增子串的前一个位置;
int n;
int i, j, top, max, pos;

printf("please input the string:\t");
scanf("%s",s);
n = strlen(s);

l[0] = 1;
m[0] = -1;
for (i=1;i<n;i++)
{
max = 0;
pos = -1;

for (j=0;j<i;j++)
if (s[j]<=s[i]&&l[j]>max)
max = l[j], pos = j;

l[i] = max + 1;
m[i] = pos;
}

max = -1;
for (i=0;i<n;i++)
if (l[i]>max)
max=l[i],pos=i;

top = 0;
for (j=0;j<max;j++)
stk[top++] = s[pos], pos = m[pos];

printf("the max is:&#