#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1005, K = 10;
#define INF 0x3fffffffffffffff
int t, n, k;
long long a[N], f[K][N], s[N][N];
inline int pos(int x, int y) {
return x+y>=n?x+y-n:x+y;
}
inline long long calc(int a, int b) {
return s[pos(a, t)][pos(b, n - a)];
}
inline void dfs(int k, int x1, int x2, int y1, int y2) {
if (x1 == x2) return;
int midx = (x1 + x2) >> 1;
int midy = -1;
f[k][midx] = INF;
for (int j = max(midx + 1, y1); j < y2; j++) {
long long v = f[k - 1][j] + calc(midx, j);
if (v < f[k][midx]) {
midy = j;
f[k][midx] = v;
}
}
dfs(k, x1, midx, y1, midy + 1);
dfs(k, midx + 1, x2, midy, y2);
return;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> k;
for (int i = n - 1; ~i; i--) cin >> a[i];
for (int i = 0; i < n; i++) {
long long sum = 0;
for (int j = 1; j <= n; j++) {
s[i][j] = s[i][j - 1] + sum;
sum += a[pos(i, j - 1)];
}
}
memset(f, 63, sizeof(f));
long long ans = INF;
f[0][n] = 0;
for (t = 0; t < n; t++) {
for (int i = 1; i <= k; i++) dfs(i, 0, n, 1, n + 1);
ans = min(ans, f[k][0]);
}
cout << ans << '\n';
return 0;
}
省选题/NOI
最新推荐文章于 2024-07-18 11:20:52 发布