【墨鳌】【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;
}
};
~~Jason_liu O(∩_∩)O