-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathP111.cpp
77 lines (69 loc) · 1.79 KB
/
P111.cpp
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
74
75
76
77
#include <iostream>
#include <stdio.h>
/*
Grading: Longest increasing subsequence
*/
typedef unsigned int uint;
int main() {
uint n;
std::cin >> n;
// Create mapping:
uint event_to_order[20] = {0}; // Events start with 1
for(uint i = 0; i < n; ++i) {
uint m;
std::cin >> m;
event_to_order[i] = m-1;
}
/*
std::cerr << "event_to_order:" << std::endl;
for(int k = 0; k < n; ++k) {
std::cerr << " " << event_to_order[k];
}
std::cerr << std::endl;
*/
while(true) {
uint student[20];
uint studentI = 0;
for(uint i = 0; i < n; ++i) {
uint m;
std::cin >> m;
if(std::cin.eof())
return 0;
student[m-1] = event_to_order[studentI];
studentI++;
}
/*
std::cerr << "Student order:" << std::endl;
for(int k = 0; k < n; ++k) {
std::cerr << " " << student[k];
}
std::cerr << std::endl;*/
// Compute max increasing subsequence length:
// Dynamic programming dp vector: dp[i,j] = Using the first i symbols, include j.
uint dp[20*20] = {0};
// Fix first row:
for(uint j = 0; j < n; ++j) {
dp[j] = 1;
}
//std::cerr << "dp:" << std::endl;
uint largest = 0;
for(uint i = 1; i < n; ++i) {
dp[i*20] = 1;
//std::cerr << 1;
for(uint j = 1; j < n; ++j) { // j is symbol location
uint maxLengthWithLessSymbols = dp[(i-1)*20+j];
uint largestInRow = 0;
for(int k = 0; k < j; ++k) {
if(dp[(i-1)*20+k] > largestInRow && student[k] < student[j])
largestInRow = dp[(i-1)*20+k];
}
dp[i*20+j] = std::max(maxLengthWithLessSymbols,largestInRow+1);
if(largest < dp[i*20+j])
largest = dp[i*20+j];
// std::cerr << " " << dp[i*20+j];
}
// std::cerr << std::endl;
}
std::cout << largest << std::endl;
}
}