最长上升子序列 CSU - 1047 ( LIS LCS )
Posted 山杉三
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最长上升子序列 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 )的主要内容,如果未能解决你的问题,请参考以下文章