Longest Ordered Subsequence
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 Source
Northeastern Europe 2002, Far-Eastern Subregion
|
提示
题意:
不用我多讲了吧,一看就知道。。。。。。(算了,我还是贴出来吧,万一戳进来是第一次做这样的题)
一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1<= i1 < i2 < ... < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8)。
你的任务,就是对于给定的序列,求出最长上升子序列的长度。
思路:
DP入门
递推式:a[i]>a[j](i>j),dp[i]=MAX(dp[i],dp[j]+1),answer=MAX(dp[i])
示例程序
Source Code
Problem: 2533 Code Length: 462B
Memory: 356K Time: 0MS
Language: GCC Result: Accepted
#include <stdio.h>
int main()
{
int n,a[1000],dp[1000],i,i1,max;
scanf("%d",&n);
for(i=0;n>i;i++)
{
scanf("%d",&a[i]);
dp[i]=1;
}
max=dp[0];
for(i=1;n>i;i++)
{
for(i1=0;i>i1;i1++)
{
if(a[i]>a[i1]&&dp[i]<dp[i1]+1)
{
dp[i]=dp[i1]+1;
}
}
if(dp[i]>max)
{
max=dp[i];
}
}
printf("%d",max);
return 0;
}