Salvens

E

Aug 2nd, 2023
947
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.72 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <vector>
  5. #include <array>
  6. #include <set>
  7. #include <map>
  8.  
  9. using namespace std;
  10.  
  11. #define int long long
  12.  
  13. const long long INF = 1e18 + 7;
  14. const int MAXN = 1e5 + 100;
  15. const int N = 3e5 + 10;
  16. const int MOD = 1e9 + 7;
  17.  
  18. int dp[MAXN][1 << 7];
  19. int s[MAXN][7];
  20.  
  21. bool comp(const pair<int, int>& lhs, const pair<int, int>& rhs) {
  22.     return lhs.first > rhs.first;
  23. }
  24.  
  25. void init_dp(int n, int p) {
  26.     for (int i = 0; i <= n; ++i) {
  27.         for (int j = 0; j < (1 << p); ++j) {
  28.             dp[i][j] = -1;
  29.         }
  30.     }
  31. }
  32.  
  33. signed main() {
  34.     ios_base::sync_with_stdio(false);
  35.     cin.tie(nullptr);
  36.     cout.tie(nullptr);
  37.     int n, p, k;
  38.     cin >> n >> p >> k;
  39.     init_dp(n, p);
  40.     vector<pair<int, int>> a(n + 1);
  41.     for (int i = 1; i <= n; ++i) {
  42.         cin >> a[i].first;
  43.         a[i].second = i;
  44.     }
  45.     sort(a.begin() + 1, a.end(), comp);
  46.     for (int i = 1; i <= n; ++i) {
  47.         for (int j = 0; j < p; ++j) {
  48.             cin >> s[i][j];
  49.         }
  50.     }
  51.     dp[0][0] = 0;
  52.     for (int i = 1; i <= n; ++i) {
  53.         for (int mask = 0; mask < (1 << p); ++mask) {
  54.             if (dp[i - 1][mask] != -1) {
  55.                 int cnt = (i - 1) - __builtin_popcountll(mask);
  56.                 dp[i][mask] = dp[i - 1][mask] + (cnt < k ? a[i].first : 0);
  57.             }
  58.             for (int j = 0; j < p; ++j) {
  59.                 if (!(mask & (1 << j)) || dp[i - 1][mask ^ (1 << j)] == -1) {
  60.                     continue;
  61.                 }
  62.                 int pos = a[i].second;
  63.                 dp[i][mask] = max(dp[i][mask], dp[i - 1][mask ^ (1 << j)] + s[pos][j]);
  64.             }
  65.         }
  66.     }
  67.     cout << dp[n][(1 << p) - 1] << '\n';
  68. }
Advertisement
Add Comment
Please, Sign In to add comment