题目链接 http://poj.org/problem?id=2533
B - Longest Ordered Subsequence
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.
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
题意:最长上升子序列
思路:基础线性DP
状态:DP【i】表示前i个元素所能达到的最大子序列长度
状态转移:dp[i]=max(dp[i],dp[k]+1); 其中1<=k<=i
决策:如果a[i]>a[j],则更新结果
目标:MAX(DP[i])
代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define ll long long int using namespace std; int a[1005]; int dp[1005]; int n; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; dp[i]=1;//边界初始化 } int MAX=0; for(int i=1;i<=n;i++)//阶段 for(int k=1;k<=i;k++) { if(a[i]>a[k]) dp[i]=max(dp[i],dp[k]+1);//状态转移 MAX=max(MAX,dp[i]);//目标 } cout<<MAX<<endl; return 0; }