Advertisement
BaoJIaoPisu

Untitled

Aug 14th, 2021
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.30 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pb push_back
  5. #define pf push_front
  6. #define popb pop_back
  7. #define popf pop_front
  8. #define ins insert
  9. #define pq priority_queue
  10. #define minele min_element
  11. #define maxele max_element
  12. #define lb lower_bound
  13. #define ub upper_bound
  14. #define cnt_bit __builtin_popcount
  15. #define debug(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
  16. using namespace std;
  17.  
  18. typedef long long ll;
  19. typedef pair<ll, ll> pll;
  20. typedef pair<int, int> pii;
  21.  
  22.  
  23. int d4x[4] = {1, 0, -1, 0}; int d4y[4] = {0, 1, 0, -1};
  24. int d8x[8] = {0, 1, 1, 1, 0, -1, -1, -1};
  25. int d8y[8] = {1, 1, 0, -1, -1, -1, 0, 1};
  26.  
  27. const ll oo = 1e16;
  28. const ll maxN = 1e6;
  29.  
  30. void maximize(int &a, int b) {
  31.     a = max(a, b);
  32. }
  33.  
  34. void minimize(int &a, int b) {
  35.     a = min(a, b);
  36. }
  37.  
  38. ll a[3030], b[3030], c[3030];
  39. ll dp[220][220][220];
  40. ll f[3][3030], nf[3][3030], LMin[3030], RMin[3030];
  41. struct P {
  42.     int a, b, c;
  43. } d[3030];
  44.  
  45. bool cmp(P _a, P _b) {
  46.     return (_a.b - _a.c < _b.b - _b.c);
  47. }
  48.  
  49. void solve() {
  50.     int n; cin >> n;
  51.     for(int i = 1; i <= n; i++) cin >> a[i] >> b[i] >> c[i];
  52.     if(n <= 200) {
  53.         for(int i = 0; i <= n; i++) {
  54.             for(int j = 0; j <= n; j++) {
  55.                 for(int k = 0; k <= n; k++) dp[i][j][k] = oo;
  56.             }
  57.         }
  58.  
  59.         dp[0][0][0] = 0;
  60.  
  61.         for(int i = 1; i <= n; i++) {
  62.             for(int j = 0; j <= i; j++) {
  63.                 for(int k = 0; k <= i - j; k++) {
  64.                     dp[i][j][k] = dp[i - 1][j][k] + a[i];
  65.                     if(j > 0) {
  66.                         dp[i][j][k] = min(dp[i][j][k], dp[i - 1][j - 1][k] + (b[i] - (j - 1)));
  67.                     }
  68.  
  69.                     if(k > 0) {
  70.                         dp[i][j][k] = min(dp[i][j][k], dp[i - 1][j][k - 1] + (c[i] - (k - 1)));
  71.                     }
  72.                 }
  73.             }
  74.         }
  75.  
  76.         ll ans = oo;
  77.         for(int i = 0; i <= n; i++) {
  78.             for(int j = 0; j <= n - i; j++)
  79.                 ans = min(ans, dp[n][i][j]);
  80.         }
  81.  
  82.         cout << ans;
  83.     } else {
  84.         ll tot = 0;
  85.         for(int i = 1; i <= n; i++) {
  86.             d[i].a = a[i];
  87.             d[i].b = b[i];
  88.             d[i].c = c[i];
  89.             tot = tot + a[i];
  90.         }
  91.  
  92.         for(int i = 1; i <= n; i++) {
  93.             d[i].b -= d[i].a;
  94.             d[i].c -= d[i].a;
  95.         }
  96.  
  97.         for(int i = 0; i <= n + 1; i++) {
  98.             for(int j = 0; j <= n + 1; j++) {
  99.                 f[0][j] = f[1][j] = -1;
  100.                 LMin[i] = RMin[i] = oo;
  101.             }
  102.         }
  103.  
  104.         sort(d + 1, d + 1 + n, cmp);
  105.  
  106.         f[0][0] = 0;
  107.         for(int i = 1; i <= n; i++) {
  108.             for(int j = 0; j <= i; j++) {
  109.                 nf[0][j] = oo;
  110.                 if(f[0][j] != -1) nf[0][j] = f[0][j];                                                            
  111.                 if(j > 0 && f[0][j - 1] != -1) nf[0][j] = min(nf[0][j], f[0][j - 1] + (d[i].b - (j - 1)));
  112.                 LMin[i] = min(LMin[i], nf[0][j]);
  113.                 if(nf[0][j] == oo) nf[0][j] = -1;
  114.             }
  115.  
  116.             for(int j = 0; j <= i; j++) {
  117.                 f[0][j] = nf[0][j];
  118.             }
  119.         }
  120.  
  121.         f[1][0] = 0;
  122.         for(int i = n; i >= 1; i--) {
  123.             for(int j = 0; j <= (n - i + 1); j++) {
  124.                 nf[1][j] = oo;
  125.                 if(f[1][j] != -1) nf[1][j] = f[1][j];
  126.                 if(j > 0 && f[1][j - 1] != -1) nf[1][j] = min(nf[1][j], f[1][j - 1] + (d[i].c - (j - 1)));
  127.                 RMin[i] = min(RMin[i], nf[1][j]);
  128.                 if(nf[0][j] == oo) nf[1][j] = -1;
  129.             }
  130.  
  131.             for(int j = 0; j <= (n - i + 1); j++) {
  132.                 f[1][j] = nf[1][j];
  133.             }
  134.         }
  135.  
  136.         ll ans = min(RMin[1], LMin[n]);
  137.         for(int i = 1; i < n; i++) ans = min(ans, LMin[i] + RMin[i + 1]);
  138.         cout << ans + tot;
  139.     }
  140. }
  141.  
  142. int main()
  143. {
  144.     ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  145.     solve();
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement