在HUNAN UNIVERSITY ACM/ICPC Judge Online 做题
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 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 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 |
Problem Source |
HNU Contest |
解决:
#include "stdio.h"
int main()
{
int n,i,j,max;
int x[1000],d[1000];
scanf("%d",&n);
if(n<2)
{
max=1;
}
else{
for(i=0;i<n;i++)
{
scanf("%d",&x[i]);
d[i]=1;
}
for(i=n-2;i>=0;i--)
{
for(j=i+1;j<n;j++)
{
if((x[j]>x[i])&&(d[i]<d[j]+1))
d[i]=d[j]+1;
}
}
for(i=0;i<n;i++)
{
if(d[i]>max) max=d[i];
}
}
printf("%d/n",max);
return 0;
}
感想:
这是一个求最长子序列问题,用动态规划算法解决。程序写得比较顺,但是刚开始提交时老是RE,不知道是怎么回事。后来请教了下,RE一般是数组越界。那最有可能出现问题的地方就是红色那块了。于是在外面加了一个if,判断n是否小于2。终于成功AC了。