基于陈述统计最多好人数

发布时间 2023-06-08 23:53:21作者: 失控D大白兔

好人:该角色只说真话。
坏人:该角色可能说真话,也可能说假话
每个人都有对其他人的描述,存为一个n×n的二维矩阵
0认为是坏人,1认为是好人,2不做评价
返回最大好人数目

1. 暴力列举 + 二进制状态位

基于矛盾判断该状态是否有效

class Solution {
public:
    int maximumGood(vector<vector<int>> &statements) {
        int ans = 0, n = statements.size();
        for (int i = 1; i < 1 << n; i++) {//枚举所有状态
            bool flag = 1;//该状态有效
            int cnt = 0; // i 中好人个数
            for (int j = 0; j < n; ++j) {//从右往左判断每一位
                if ((i >> j) & 1){  // 枚举 i 中的好人 j
                    for (int k = 0; k < n; k++)  // 枚举 j 的所有陈述
                        if (statements[j][k] < 2 && statements[j][k] != ((i >> k) & 1)){ // 该陈述与实际情况矛盾
                            flag = false;
                            break;
                        }
                    if(!flag) break;//有矛盾存在,该状态不符
                    ++cnt;
                }
            }
            if(!flag) continue;
            ans = max(ans, cnt);
        }
        return ans;
    }
};