1.タイトル
Xiaokouは、秋の市場に白黒の正方形の絵画を作成するブースがあることに気づきました。
区画の所有者は、壁に固定された回転できない白い製図板を各顧客に提供します。
描画ボードn * n
グリッド上にあります。描画ルールでは、小さなボタンで任意の数の行と任意の数の列を黒く塗りつぶすことができ、選択した行と列の数を0にすることができます。
Xiaokouは、最終製品にk個の黒いグリッドがあることを願っていますXiaokou の配色の数に戻ってください。
注:2つのスキームのいずれかで同じ位置にあるグリッドの色は異なり、異なるスキームと見なされます。
示例 1:
输入:n = 2, k = 2
输出:4
解释:一共有四种不同的方案:
第一种方案:涂第一列;
第二种方案:涂第二列;
第三种方案:涂第一行;
第四种方案:涂第二行。
示例 2:
输入:n = 2, k = 1
输出:0
解释:不可行,因为第一次涂色至少会涂两个黑格。
示例 3:
输入:n = 2, k = 4
输出:1
解释:共有 2*2=4 个格子,仅有一种涂色方案。
限制:
1 <= n <= 6
0 <= k <= n * n
出典:LeetCodeリンク:https://leetcode-cn.com/problems/ccw6C7
著作権はLeetCode が所有しています。商用転載については、正式な許可書にご連絡ください。非商用転載については、出典を明記してください。
2.問題解決
class Solution {
public:
int paintingPlan(int n, int k) {
int x, y, ans = 0;
if(n*n == k) return 1;//肯定只有一种方案
for(x = 0; x <= n; ++x)
{
for(y = 0; y <= n; ++y)
{
if((x+y)*n-x*y == k)
{
ans += C(n,x)*C(n,y);//两个方向的组合数相乘
}
}
}
return ans;
}
int C(int n, int x)
{
int up = 1, t = x, down = 1;
while(t--)
{
up *= n--;
down *= x--;
}
return up/down;
}
};
0 ms 5.9 MB
私のCSDN ブログアドレスhttps://michael.blog.csdn.net/
QRコードを長押しまたはスキャンして、私の公式アカウント(Michael Amin)をフォローし、一緒に来て、学び、一緒に進歩してください!