fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 1005;
  4. const int maxm = 8;
  5. const long long inf = 1e18;
  6.  
  7. int n, m, a[maxn], best[maxm][2];
  8. long long c[maxn][maxn], dp[maxm][maxn];
  9.  
  10. int main() {
  11. cin >> n >> m;
  12. for (int i = 0; i < n; i++) {
  13. cin >> a[i];
  14. }
  15.  
  16. for (int i = 0; i < n; i++) {
  17. for (int j = i + 1, d = 1; j != i; j = (j + 1) % n, d++) {
  18. c[i][j] = c[i][(j + n - 1) % n] + 1LL * d * a[j];
  19. }
  20. }
  21.  
  22. long long res = inf;
  23. for (int s = 0; s < n; s++) {
  24. for (int i = 0; i < n; i++) {
  25. dp[0][i] = c[s][(s + i) % n];
  26. }
  27. for (int i = 1; i <= m; i++) {
  28. best[i][0] = i - 1;
  29. }
  30. for (int d = 1; d < n; d++) {
  31. for (int l = 1; l < m && l + d < n; l++) {
  32. int r = l + d;
  33. int b = best[l][1 - d % 2];
  34. int e = best[l + 1][1 - d % 2];
  35. dp[l][r] = inf;
  36. for (int i = b; i <= e; i++) {
  37. long long cur = dp[l - 1][i]
  38. + c[(s + i + 1) % n][(s + r) % n];
  39. if (cur < dp[l][r]) {
  40. dp[l][r] = cur;
  41. best[l][d % 2] = i;
  42. }
  43. }
  44. }
  45. best[m][d % 2] = m + d - 1;
  46. }
  47. res = min(dp[m - 1][n - 1], res);
  48. }
  49. cout << res << '\n';
  50.  
  51. return 0;
  52. }
  53.  
Success #stdin #stdout 0s 11376KB
stdin
6 2
2
5
4
2
6
2
stdout
14