Maximum Students Taking Exam LeetCode solution in Java
1class Solution {2private Integer[][] f;3private int n;4private int[] ss;56public int maxStudents(char[][] seats) {7int m = seats.length;8n = seats[0].length;9ss = new int[m];10f = new Integer[1 << n][m];11for (int i = 0; i < m; ++i) {12for (int j = 0; j < n; ++j) {13if (seats[i][j] == '.') {14ss[i] |= 1 << j;15}16}17}18return dfs(ss[0], 0);19}2021private int dfs(int seat, int i) {22if (f[seat][i] != null) {23return f[seat][i];24}25int ans = 0;26for (int mask = 0; mask < 1 << n; ++mask) {27if ((seat | mask) != seat || (mask & (mask << 1)) != 0) {28continue;29}30int cnt = Integer.bitCount(mask);31if (i == ss.length - 1) {32ans = Math.max(ans, cnt);33} else {34int nxt = ss[i + 1];35nxt &= ~(mask << 1);36nxt &= ~(mask >> 1);37ans = Math.max(ans, cnt + dfs(nxt, i + 1));38}39}40return f[seat][i] = ans;41}42}