第一次ak来的有点猝不及防,哈哈哈
前三题比较简单都是一次过,第四题看了下数据集大小就知道是用状态压缩了。
思路就是遍历每一种可能,对每个人只有坏人和好人之分。也就是不是0就是1. 还要明确一点就是坏人说的话其实是不重要的,因为他说的有可能是真话或者假话。所以我们从假设说真话的人的statement出发就行了,用说真话的人的statement来和我们的choose对比
假设某人是好人,从它的观点出发来查看我们的假设跟statement是符不符合就ok了
public int maximumGood(int[][] statements) {
int n = statements.length;
int good = 0;
for (int i = 1; i < (1 << n); i++) {
if (valid(statements, i, n)) {
good = Math.max(good, Integer.bitCount(i));
}
}
return good;
}
private boolean valid(int[][] statements, int choose, int n) {
int goodpeople = 0;
for (int i = 0; i < n; i++) {
// 如果这个人是好人。他有可能对其他好人没有描述,也可能直接指明其他人是好人还是坏人
if (((1 << i) & choose) != 0) {
int[] s = statements[i];
for (int j = 0; j < s.length; j++) {
// 如果直接指明其他人是坏人 但 choose是好人,那就矛盾
if (s[j] == 0 && ((1 << j) & choose) != 0) {
return false;
}
// 如果这个人是好人但是在choose中是坏人 那也是矛盾
if (s[j] == 1 && ((1 << j) & choose) == 0) {
return false;
}
}
}
}
return true;
}