fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7.  
  8. const int INF = 1e9;
  9. const ll LINF = 1e18;
  10.  
  11. const int N = 5e3 + 5;
  12.  
  13. template<typename T>
  14. bool minimize(T& a, const T& b) {
  15. if (b < a) {a = b; return true;}
  16. return false;
  17. }
  18.  
  19. int n;
  20. int a[N];
  21. ll pref[N];
  22.  
  23. ll getSum(int l, int r) {
  24. return pref[r] - pref[l - 1];
  25. }
  26.  
  27. ll dp[N][N]; // dp[l][r] = Chi phí ít nhất để gộp các phần tử trong đoạn [l, r] về thành 1 phần tử duy nhất
  28. int opt[N][N]; // opt[l][r] = Điểm k (điểm cắt) tối ưu cho dp[l][r]
  29.  
  30. int main() {
  31. ios::sync_with_stdio(false);
  32. cin.tie(nullptr);
  33. cin >> n;
  34. for (int i = 1; i <= n; i++) {
  35. cin >> a[i];
  36. pref[i] = pref[i - 1] + a[i];
  37. }
  38.  
  39. for (int l = 1; l <= n; l++) {
  40. for (int r = l; r <= n; r++) {
  41. dp[l][r] = LINF;
  42. opt[l][r] = -1;
  43. }
  44. }
  45.  
  46. for (int l = 1; l <= n; l++) {
  47. dp[l][l] = 0;
  48. opt[l][l] = l;
  49. }
  50.  
  51. for (int l = n; l >= 1; l--) {
  52. for (int r = l + 1; r <= n; r++) {
  53. for (int k = opt[l][r - 1]; k <= opt[l + 1][r]; k++) {
  54. ll cost = getSum(l, r);
  55. if (minimize(dp[l][r], dp[l][k] + dp[k + 1][r] + cost)) {
  56. opt[l][r] = k;
  57. }
  58. }
  59. }
  60. }
  61.  
  62. cout << dp[1][n] << '\n';
  63. }
Success #stdin #stdout 0.01s 5748KB
stdin
5
2 7 3 2 5
stdout
43