Advertisement
DuongNhi99

QBSELECT (2)

Dec 10th, 2020
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.41 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int N = 10005;
  5.  
  6. int n;
  7. int64_t a[5][N];
  8. int d[] = {0, 1, 2, 4, 5, 8, 9, 10};
  9. int64_t dp[N][20];
  10. int64_t res = -1e8;
  11.  
  12. int get_bit(int x, int k) {
  13.     return (x >> k) & 1;
  14. }
  15.  
  16. int64_t get_sum(int i, int x) {
  17.     return get_bit(x, 0)*a[0][i] + get_bit(x, 1)*a[1][i] + get_bit(x, 2)*a[2][i] + get_bit(x, 3)*a[3][i];
  18. }
  19.  
  20. bool Check(int x, int y) {
  21.     for(int i = 0; i < 4; ++i) {
  22.         if(get_bit(x, i) == 1 && get_bit(y, i) == 1)
  23.             return false;
  24.     }
  25.     return true;
  26. }
  27.  
  28. void solve() {
  29.     cin >> n;
  30.     for(int i = 0; i < 4; ++i)
  31.         for(int j = 1; j <= n; ++j) {
  32.             cin >> a[i][j];
  33.             res = max(res, a[i][j]);
  34.         }
  35.  
  36.     if(res < 0) {
  37.         cout << res << '\n';
  38.         return;
  39.     }
  40.  
  41.     for(int i = 1; i <= n; ++i) {
  42.         for(int x = 0; x < 8; ++x) {
  43.             int64_t sum = get_sum(i, d[x]);
  44.  
  45.             for(int y = 0; y < 8; ++y)
  46.                 if(Check(d[x], d[y]))
  47.                     dp[i][d[x]] = max(dp[i][d[x]], dp[i-1][d[y]] + sum);
  48.  
  49.             res = max(res, dp[n][d[x]]);
  50.         }
  51.     }
  52.  
  53.     cout << res << '\n';
  54. }
  55.  
  56. int main() {
  57.     //freopen("in.txt", "r", stdin);
  58.     //freopen("QBSELECT 2.inp", "r", stdin);
  59.     //freopen("QBSELECT 2.out", "w", stdout);
  60.     ios_base::sync_with_stdio(false);
  61.     cin.tie(NULL); cout.tie(NULL);
  62.  
  63.     solve();
  64.  
  65.     return 0;
  66. }
  67.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement