forked from daiwb/Algorithm
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path183.cpp
More file actions
64 lines (55 loc) · 1.35 KB
/
183.cpp
File metadata and controls
64 lines (55 loc) · 1.35 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
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define INF 1000000000
#define REP(i,n) for(int i=0;i<(n);++i)
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
#define RFOR(i,a,b) for(int i=(a);i>=(b);--i)
int n, m;
int C[10005];
int mm[10005][105];
/*int dp(int now, int last) {
int& ret = mm[now][last];
if (ret != -1) return ret;
int idx = now + m - last;
if (idx >= n) return ret = 0;
ret = INF;
FOR(i,now+1,idx) {
int t = C[i] + dp(i, i - now);
ret = min(ret, t);
}
return ret;
}*/
int main() {
scanf("%d %d", &n, &m);
REP(i,n) scanf("%d", &C[i]);
//REP(i,10005) C[i] = 10000;
int res = INF;
memset(mm, -1, sizeof(mm));
FOR(i,1,m-1) mm[n - 1][i] = 0;
RFOR(i,n-2,0) {
FOR(j,1,m-1) {
if (i - j < 0) break;
int idx = i + m - j;
if (idx >= n) mm[i][j] = 0;
else {
mm[i][j] = INF;
FOR(k,i+1,idx) {
int t = C[k] + mm[k][k - i];
mm[i][j] = min(mm[i][j], t);
}
}
}
}
REP(i,m) {
FOR(j,i+1,m-1) {
int t = C[i] + C[j];
//t += dp(j, j - i);
t += mm[j][j - i];
res = min(res, t);
}
}
printf("%d\n", res);
return 0;
}