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 = 4e2 + 5;
  12.  
  13. template<typename T>
  14. void minimize(T& a, const T& b) {
  15. if (b < a) a = b;
  16. }
  17.  
  18. int n;
  19. int a[N];
  20. ll pref[N];
  21.  
  22. ll getSum(int l, int r) {
  23. return pref[r] - pref[l - 1];
  24. }
  25.  
  26. // 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
  27. ll memo [N][N];
  28.  
  29. ll dp(int l, int r) {
  30. if (l == r) return 0;
  31. if (l + 1 == r) return a[l] + a[r];
  32.  
  33. ll& ans = memo[l][r];
  34. if (ans != -1) return ans;
  35.  
  36. ans = LINF;
  37. for (int k = l; k < r; k++) {
  38. minimize(ans, dp(l, k) + dp(k + 1, r) + getSum(l, r));
  39. }
  40.  
  41. return ans;
  42. }
  43.  
  44. int main() {
  45. ios::sync_with_stdio(false);
  46. cin.tie(nullptr);
  47. cin >> n;
  48. for (int i = 1; i <= n; i++) {
  49. cin >> a[i];
  50. pref[i] = pref[i - 1] + a[i];
  51. }
  52.  
  53. memset(memo, -1, sizeof memo);
  54.  
  55. cout << dp(1, n) << '\n';
  56. }
Success #stdin #stdout 0.01s 5284KB
stdin
4
10 20 30 40
stdout
190