1. 程式人生 > >poj-2533 longest ordered subsequence(動態規劃)

poj-2533 longest ordered subsequence(動態規劃)

末尾 ring pac cond print ges sam fine nlog

Time limit2000 ms

Memory limit65536 kB

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

題意 求最大上升子序列的長度
題解 dp[i]就是以a[i]為末尾的最長上升子序列的長度,我寫的是O(n^2)的復雜度,也可以用二分查找去找,那個是O(nlog n)
#include<iostream>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<stack>
using
namespace std; #define PI 3.14159265358979323846264338327950 #define INF 0x3f3f3f3f; int n; int dp[1010]; int a[1010]; void solve() { int res=0; for(int i=0;i<n;i++) { dp[i]=1; for(int j=0;j<i;j++) { if(a[j]<a[i]) { dp[i]=max(dp[i],dp[j]+1); } } res=max(res,dp[i]); } printf("%d\n",res); } int main() { cin>>n; for(int i=0;i<n;i++) cin>>a[i]; solve(); }

poj-2533 longest ordered subsequence(動態規劃)