-
Notifications
You must be signed in to change notification settings - Fork 0
/
Longest Increasing Subsequence
74 lines (48 loc) · 1.8 KB
/
Longest Increasing Subsequence
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
Longest Increasing Subsequence
Problem Description
Find the longest increasing subsequence of a given array of integers, A.
In other words, find a subsequence of array in which the subsequence's elements are in strictly increasing order, and in which the subsequence is as long as possible.
In this case, return the length of the longest increasing subsequence.
Problem Constraints
0 <= length(A) <= 2500
1 <= A[i] <= 2500
Input Format
The first and the only argument is an integer array A.
Output Format
Return an integer representing the length of the longest increasing subsequence.
Example Input
Input 1:
A = [1, 2, 1, 5]
Input 2:
A = [0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15]
Example Output
Output 1:
3
Output 2:
6
Example Explanation
Explanation 1:
The longest increasing subsequence: [1, 2, 5]
Explanation 2:
The possible longest increasing subsequences: [0, 2, 6, 9, 13, 15] or [0, 4, 6, 9, 11, 15] or [0, 4, 6, 9, 13, 15]
solution:
int Solution::lis(const vector<int> &A) {
if (V.size() == 0) return 0;
int longest[V.size() + 1];
int maxLen = 1;
memset(longest, 0, sizeof(longest));
// longest[i] denotes the maximum length of increasing subsequence that ends
// with V[i].
longest[0] = 1;
for (int i = 1; i < V.size(); i++) {
longest[i] = 1;
// V[i] can only come after any V[j] such that V[j] < V[i].
// We try appending V[i] after every such subsequence and update our
// longest[i].
for (int j = 0; j < i; j++) {
if (V[j] < V[i]) longest[i] = max(longest[i], longest[j] + 1);
}
maxLen = max(maxLen, longest[i]);
}
return maxLen;
}