【墨鳌】【LCP 22. 黑白方格画】

组合数学

\(O(N\cdot M)\)

class Solution {
public:
    int f[10][10];

    int C(int n, int m) {
        if (n == m || m == 0) return 1;
        return f[n][m] = C(n - 1, m - 1) + C(n - 1, m);
    }

    int paintingPlan(int n, int k) {
        if (k == 0 || k == n * n) return 1;
        int ans = 0;
        for (int i = 0; i <= n; i++) {
            for (int j = 0; j <= n; j++) {
                if (n * i + n * j - i * j == k) {
                    ans += C(n, i) * C(n, j);
                }
            }
        }
        return ans;
    }
};

01枚举

\(O(2^{2N})\)

class Solution {
public:
    int paintingPlan(int n, int k) {
        if (n * n == k) return 1;
        int ans = 0;
        for (int i = 0; i < (1 << n); i++) {
            for (int j = 0; j < (1 << n); j++) {
                int x = __builtin_popcount(i);
                int y = __builtin_popcount(j);
                int sum = (x + y) * n - x * y;//黑色方格总数
                ans += (sum == k);                
            }
        }
        return ans;
    }
};
posted @ 2022-03-08 22:26  墨鳌  阅读(42)  评论(0编辑  收藏  举报