-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathdiff_Main.cpp
More file actions
66 lines (63 loc) · 1.34 KB
/
Copy pathdiff_Main.cpp
File metadata and controls
66 lines (63 loc) · 1.34 KB
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
diff --git a/CodeJam/Main.cpp b/examples/2019/KS_F/A/Main.cpp
index 2150379..8263500 100644
--- a/CodeJam/Main.cpp
+++ b/examples/2019/KS_F/A/Main.cpp
@@ -1570,11 +1570,61 @@ void init(){
cin >> T;
}
+ll N, K;
+
+v(ll) Ai;
+d(ll, d(ll, ll)) Rij, Fij;
+
void readInput(){
+ cin >> N >> K;
+ Ai.cl;
+ forn(i, N){
+ ll t;
+ cin >> t;
+ Ai.pb(t);
+ }
+ Rij.cl;
+ Fij.cl;
+}
+
+ll R(ll i, ll j){
+ lassert(i<j, "R: i is not smaller than j");
+ if(Rij.count(i) && Rij[i].count(j)){
+ return Rij[i][j];
+ }
+ d(ll, ll) counts;
+ fornn(c, i, j){
+ counts[Ai[c]]++;
+ }
+ auto it = max_element(all(counts), [](p(ll, ll) a, p(ll, ll) b){return a.nd<b.nd;});
+ Rij[i][j] = j - i - it->nd;
+ return Rij[i][j];
+}
+
+ll F(ll i, ll k){
+ if(i<=1)
+ return 0;
+ if(k==0)
+ return R(0, i);
+ lassert(k>0, "F: k is not bigger than 0");
+ if(Fij.count(i) && Fij[i].count(k)){
+ return Fij[i][k];
+ }
+ ll minval = INF;
+ forn(j, i){
+ ll curval = F(j, k-1) + R(j, i);
+ llog("curval:", curval);
+ if (curval < minval)
+ minval=curval;
+ }
+ llog("minval:", minval);
+ Fij[i][k] = minval;
+ return Fij[i][k];
}
// write to COMM_TYPE result
void calcFunction() {
+ result = F(N, K);
}
} // namespace task