最多可达成的换楼请求数目
难度:中等
这道题很好理解,但是一点都不好做,看了题解果然是我还没掌握的状压dp…直接cv了
代码如下:
class Solution {
int[][] rs;
public int maximumRequests(int n, int[][] requests) {
rs = requests;
int m = rs.length, ans = 0;
for (int i = 0; i < (1 << m); i++) {
int cnt = getCnt(i);
if (cnt <= ans) continue;
if (check(i)) ans = cnt;
}
return ans;
}
boolean check(int s) {
int[] cnt = new int[20];
int sum = 0;
for (int i = 0; i < 16; i++) {
if (((s >> i) & 1) == 1) {
int a = rs[i][0], b = rs[i][1];
if (++cnt[a] == 1) sum++;
if (--cnt[b] == 0) sum--;
}
}
return sum == 0;
}
int getCnt(int s) {
int ans = 0;
for (int i = s; i > 0; i -= (i & -i)) ans++;
return ans;
}
}
执行结果:成功