1. 程式人生 > >最長上升子序列 CSU - 1047 ( LIS LCS )

最長上升子序列 CSU - 1047 ( LIS LCS )

增長 csu pre style 數據 memset amp family 名詞解釋

名詞解釋:

一串數字比如1、5、3、6、9、8、10,它的子序列是從左到右不連續的若幹個數,比如1、5、6,3、9、8、10都是它的子序列。

最長上升子序列即從左到右嚴格增長的最長的一個子序列,1、5、6、9、10就是這個序列的一個最長上升子序列。

給出若幹序列,求出每個序列的最長上升子序列長度。

Input

多組數據,每組第一行正整數n,1 <= n <= 1000,第二行n個空格隔開的不大於1,000,000的正整數。

Output

每組數據輸出一行,最長上升子序列的長度。

Sample Input

7
1 5 3 6 9 8 10

Sample Output

5

解題思路: LIS的題目,但是還不是很明白相關的算法,就使用了排序+LCS的方法


 1 #include <iostream>
 2 #include <algorithm>
 3 #include <stdio.h>
 4 #include <string.h>
 5 using namespace std;
 6 
 7 const int MAX  = 1000 + 92;
 8 int a[MAX],b[MAX];
 9 int visit[MAX][MAX];
10 int n;
11 
12 void LCS()
13 {
14     for(int i = 1;i <=n;i++)
15     {
16 
17
for(int j = 1;j <=n;j++) 18 { 19 if(a[i]==b[j]) 20 visit[i][j] = visit[i-1][j-1] + 1; 21 else if(visit[i-1][j]>visit[i][j-1]) 22 visit[i][j] = visit[i-1][j]; 23 else 24 visit[i][j] = visit[i][j-1
]; 25 } 26 27 } 28 cout<<visit[n][n]<<endl; 29 30 } 31 32 int main() 33 { 34 35 while(cin>>n) 36 { 37 memset(visit,0,sizeof(visit)); 38 a[0] = 0; 39 b[0] = 0; 40 for(int i = 1;i <=n;i++) 41 { 42 int temp; 43 cin>>temp; 44 a[i] = temp; 45 b[i] = temp; 46 } 47 48 sort(b,b+n+1); 49 LCS(); 50 } 51 52 53 return 0; 54 }

最長上升子序列 CSU - 1047 ( LIS LCS )