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 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.
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 file must contain a single integer - the length of the longest ordered
subsequence of the given sequence.
Sample Input
subsequence of the given sequence.
7 1 7 3 5 9 4 8Sample Output
4
题意:求最长上升子序列。题解:用动态规划,dp[i]表示对于第i个元素,
前面第1到第i - 1个元素中的最长上升子序列。当第i个元素比前面第j个元素
大时,满足状态转移方程dp[i] = max(dp[i],dp[j] + 1)。但是有一点要注意
:最后一个元素不一定代表着是最长的上升子序列。所以dp[n]不一定等于max。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 2010;
int main()
{
int num[maxn];
int dp[maxn];
int n;
int i,j;
int maxx;
while(scanf("%d",&n) != EOF)
{
maxx = 1;
memset(dp,0,sizeof(dp));
memset(num,0,sizeof(num));
for(i = 1;i <= n;i++)
{
scanf("%d",&num[i]);
}
for(i = 0;i <= n;i++)
{
dp[i] = 1;
}
for(i = 2;i <= n;i++)
{
for(j = 1;j < i;j++)
{
if(num[j] < num[i])
{
dp[i] = max(dp[i],dp[j] + 1);
}
maxx = max(dp[i],maxx);
}
}
printf("%d\n",maxx);
}
}