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 ll LINF = 1e18;
  9. const int INF = 1e9;
  10.  
  11. int n, k;
  12. int h[12], pref_mx[12], suf_mx[12];
  13. ll best;
  14.  
  15. void backtrack(int i, int k) {
  16. if (i == n) {
  17. pref_mx[0] = h[0];
  18. for (int i = 1; i < n; i++) pref_mx[i] = max(pref_mx[i - 1], h[i]);
  19.  
  20. suf_mx[n - 1] = h[n - 1];
  21. for (int i = n - 2; i >= 0; i--) suf_mx[i] = max(suf_mx[i + 1], h[i]);
  22.  
  23. ll ans = 0;
  24. for (int i = 1; i + 1 < n; i++) {
  25. ans += max(0, min(pref_mx[i - 1], suf_mx[i + 1]) - h[i]);
  26. }
  27.  
  28. best = max(best, ans);
  29. return;
  30. }
  31.  
  32. for (int j = 0; j <= k; j++) {
  33. h[i] += j;
  34. backtrack(i + 1, k - j);
  35. h[i] -= j;
  36. }
  37. }
  38. // Gọi x(i) là số đồng Phúc dùng cho cột thứ i
  39. // Ta có x(1) + x(2) + ... + x(n) <= k (1)
  40. // Số nghiệm của (1) <=> x(1) + x(2) + ... + x(n) + x(n + 1) = k
  41. // => C(k + n, n) (Chia kẹo Euler)
  42. // => Độ phức tạp: O(C(k + n, n) * n)
  43.  
  44. int main() {
  45. ios::sync_with_stdio(false);
  46. cin.tie(nullptr);
  47. cin >> n >> k;
  48.  
  49. for (int i = 0; i < n; i++) cin >> h[i];
  50.  
  51. best = 0;
  52. backtrack(0, k);
  53.  
  54. cout << best << '\n';
  55. }
  56.  
Success #stdin #stdout 0s 5324KB
stdin
9 2
1 4 1 2 2 4 1 2 1
stdout
11