1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| class Solution { public: int n; static const int maxn = 4e2 + 50, maxm = (1 << 7); bool pre[maxn][maxm], suf[maxn][maxm]; bool preK[maxn][maxm], sufK[maxn][maxm]; int maxValue(vector<int>& nums, int K) { n = nums.size(); memset(pre, 0, sizeof(pre)), memset(preK, 0, sizeof(preK)); pre[0][0] = 1; for (int i = 0; i < n; ++i) { for (int j = min(K - 1, i); j >= 0; --j) { for (int k = 0; k < (1 << 7); ++k) { if (pre[j][k]) pre[j + 1][k | nums[i]] = 1; } } if (i + 1 >= K) { for (int j = 0; j < (1 << 7); ++j) preK[i + 1][j] = pre[K][j]; } } memset(suf, 0, sizeof(suf)), memset(sufK, 0, sizeof(sufK)); suf[0][0] = 1; for (int i = n; i >= 1; --i) { for (int j = min(K - 1, n - i); j >= 0; --j) { for (int k = 0; k < (1 << 7); ++k) { if (suf[j][k]) suf[j + 1][k | nums[i - 1]] = 1; } } if (n - i + 1 >= K) { for (int j = 0; j < (1 << 7); ++j) sufK[i - 1][j] = suf[K][j]; } } int ans = 0; for (int i = K; i <= n - K; ++i) { for (int x = 0; x < (1 << 7); ++x) { if (preK[i][x]) for (int y = 0; y < (1 << 7); ++y) { if (sufK[i][y]) ans = max(ans, x ^ y); } } } return ans; } };
|