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 slimes trong đoạn [l, r] về thành 1 slime
  27. ll memo[N][N];
  28.  
  29. ll dp(int l, int r) {
  30. if (l == r) return 0;
  31.  
  32. ll& ans = memo[l][r];
  33. if (ans != -1) return ans;
  34.  
  35. ans = LINF;
  36. for (int k = l; k < r; k++) {
  37. minimize(ans, dp(l, k) + dp(k + 1, r) + getSum(l, r));
  38. }
  39.  
  40. return ans;
  41. }
  42.  
  43. int main() {
  44. ios::sync_with_stdio(false);
  45. cin.tie(nullptr);
  46. cin >> n;
  47. for (int i = 1; i <= n; i++) {
  48. cin >> a[i];
  49. pref[i] = pref[i - 1] + a[i];
  50. }
  51.  
  52. memset(memo, -1, sizeof memo);
  53.  
  54. cout << dp(1, n) << '\n';
  55. }
Success #stdin #stdout 0.01s 5324KB
stdin
4
10 20 30 40
stdout
190