Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class TopXorerEasy {
- public int maximalRating(int a, int b, int c) {
- int[][][][] dp = new int[30][2][2][2];
- for (int i = 0; i < 30; i++)
- for (int x = 0; x < 2; x++)
- for (int y = 0; y < 2; y++)
- for (int z = 0; z < 2; z++)
- dp[i][x][y][z] = -1;
- int ans = rec(29, 0, 0, 0, a, b, c, dp);
- return ans;
- }
- int rec(int i, int x, int y, int z, int a, int b, int c, int[][][][] dp) {
- if (dp[i][x][y][z] != -1)
- return dp[i][x][y][z];
- if (i == 0) {
- if (x == 1 || y == 1 || z == 1)
- return dp[i][x][y][z] = 1;
- if ((a & 1) == 1 || (b & 1) == 1 || (c & 1) == 1)
- return dp[i][x][y][z] = 1;
- return dp[i][x][y][z] = 0;
- }
- int ans = 0;
- for (int l = 0; l < 2; l++) {
- for (int m = 0; m < 2; m++) {
- for (int n = 0; n < 2; n++) {
- int ex = 0;
- if ((((1 << i) & a) == 0) && x == 0 && l == 1) {
- continue;
- }
- if ((((1 << i) & b) == 0) && y == 0 && m == 1) {
- continue;
- }
- if ((((1 << i) & c) == 0) && z == 0 && n == 1) {
- continue;
- }
- if (x == 1 || ((((1 << i) & a) != 0) && x == 0 && l == 0)) {
- ex = (1 << i);
- }
- if (y == 1 || ((((1 << i) & b) != 0) && y == 0 && m == 0)) {
- ex = (1 << i);
- }
- if (z == 1 || ((((1 << i) & c) != 0) && z == 0 && n == 0)) {
- ex = (1 << i);
- }
- ans = Math.max(ans, ex + rec(i - 1, l, m, n, a, b, c, dp));
- }
- }
- }
- return dp[i][x][y][z] = ans;
- }
- }
Add Comment
Please, Sign In to add comment