fork download
  1. #include <bits/stdc++.h>
  2.  
  3. #define ll long long
  4. #define el cout << '\n'
  5.  
  6. using namespace std;
  7.  
  8. const int maxn = 3e3;
  9. const int maxk = 3e3;
  10. const ll INF = 1e18;
  11.  
  12. int n, k;
  13. ll pre[maxn + 10], dp[maxn + 10][maxk + 10];
  14.  
  15. ll f(int i, int j, int k)
  16. {
  17. return dp[k][j] + (pre[i] - pre[k]) * (pre[i] - pre[k]);
  18. }
  19.  
  20. int main()
  21. {
  22. ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  23. if (fopen("SQUARE.INP", "r"))
  24. {
  25. freopen("SQUARE.INP", "r", stdin);
  26. freopen("SQUARE.OUT", "w", stdout);
  27. }
  28.  
  29. cin >> n >> k;
  30. pre[0] = 0;
  31. for (int i = 1; i <= n; i++)
  32. {
  33. ll x;
  34. cin >> x;
  35. pre[i] = pre[i - 1] + x;
  36. }
  37. for (int i = 1; i <= n; i++)
  38. for (int j = 0; j <= k; j++)
  39. dp[i][j] = INF;
  40. for (int i = 1; i <= n; i++)
  41. dp[i][1] = pre[i] * pre[i];
  42. for (int j = 2; j <= k; j++)
  43. {
  44. for (int i = 1; i <= n; i++)
  45. {
  46. // for (int k = 1; k <= i; k++)
  47. // dp[i][j] = min(dp[i][j], f(i, j - 1, k - 1));
  48. int l = 1, r = i;
  49. ll ans = 0;
  50. while (l <= r)
  51. {
  52. int m = l + r >> 1;
  53. if (f(i, j - 1, m - 1) <= f(i, j - 1, m))
  54. {
  55. ans = f(i, j - 1, m - 1);
  56. r = m - 1;
  57. }
  58. else
  59. {
  60. ans = f(i, j - 1, m);
  61. l = m + 1;
  62. }
  63. }
  64. dp[i][j] = ans;
  65. }
  66. }
  67. cout << dp[n][k];
  68. }
Success #stdin #stdout 0.01s 5280KB
stdin
Standard input is empty
stdout
Standard output is empty