1. 程式人生 > >題解報告:poj 2533 Longest Ordered Subsequence(LIS)

題解報告:poj 2533 Longest Ordered Subsequence(LIS)

where line poj 2533 output bound poj must 問題 iostream

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
解題思路:典型dp:最長上升子序列問題。有兩種解法,一種O(n^2),另一種是O(nlogn)。相關詳細的講解:LIS總結
AC代碼一:樸素O(n^2)算法,數據小直接暴力。
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<string.h>
 5 using namespace std;
 6 const int maxn=1005;
 7 int n,res,dp[maxn],a[maxn];
8 int main(){ 9 while(~scanf("%d",&n)){ 10 memset(dp,0,sizeof(dp));res=0; 11 for(int i=0;i<n;++i)scanf("%d",&a[i]),dp[i]=1; 12 for(int i=0;i<n;++i){ 13 for(int j=0;j<i;++j) 14 if(a[j]<a[i])dp[i]=max(dp[i],dp[j]+1);//只包含i本身長度為1的子序列 15 res=max(res,dp[i]); 16 } 17 printf("%d\n",res); 18 } 19 return 0; 20 }

AC代碼二:進一步優化,采用二分每次更新最小序列,最終最小序列的長度就是最長上升子序列長度。時間復雜度是O(nlogn)。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<string.h>
 5 using namespace std;
 6 const int maxn=1005;
 7 const int INF=0x3f3f3f3f;
 8 int n,res,x,dp[maxn];
 9 int main(){
10     while(~scanf("%d",&n)){
11         memset(dp,0x3f,sizeof(dp));
12         for(int i=1;i<=n;++i){
13             scanf("%d",&x);
14             *lower_bound(dp,dp+n,x)=x;//更新最小序列
15         }
16         printf("%d\n",lower_bound(dp,dp+n,INF)-dp);
17     }
18     return 0;
19 }

題解報告:poj 2533 Longest Ordered Subsequence(LIS)