Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- pair<int,int> part3(const vector<string>& grid, const vector<string>& sequence) {
- constexpr int INF = 1e9;
- const int n = (int)grid[0].size(), slots = (n + 1) / 2, tokens = (int)sequence.size(), m = 1 << tokens;
- vector winnings(slots, vector<int>(tokens));
- for (int slot = 0; slot < slots; slot++) {
- for (int token = 0; token < tokens; token++)
- winnings[slot][token] = max(0, runSlot(grid, n, slot * 2, sequence[token]) * 2 - slot - 1);
- }
- vector dp_min(m, INF), dp_max(m, 0);
- dp_min[0] = 0;
- for (int slot = 0; slot < slots; slot++) {
- for (int mask = m - 1; mask > 0; mask--) {
- int mask1 = mask;
- while (mask1) {
- const int token = __builtin_ctz(mask1);
- dp_min[mask] = min(dp_min[mask], dp_min[mask - (1 << token)] + winnings[slot][token]);
- dp_max[mask] = max(dp_max[mask], dp_max[mask - (1 << token)] + winnings[slot][token]);
- mask1 -= 1 << token;
- }
- }
- }
- return {dp_min.back(),dp_max.back()};
- }
Add Comment
Please, Sign In to add comment