首页 > 代码库 > 最长上升子序列 CSU - 1047 ( LIS LCS )

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

名词解释:

一串数字比如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 )