题目描述:
解题思路:
比赛的时候,知道了思路,就是找到需要i行j列,然后算出C(n,i)和C(n,j),将这两个相乘即可,但是问题是无法确定给的k是否满足要求,所以排列组合求出的值也可能是错误的。
题目说要么全图一行要么全图一列,这里的公式(i+j)n-ij就是只涂行和列的个数,所以两层for循环,枚举行和列,当等于k的时候算出行列排列组合相乘。因为行和列是不同的情况,所以还要自身相加。
排列组合参考代码:
//C(m,n)
private static int Combination(int n, int k) {
if (k == 0 || k == n)
return 1;
else
return Combination(n - 1, k) + Combination(n - 1, k - 1);
}
AC代码:
class Solution {
public static int paintingPlan(int n, int k) {
int ans=0;
if(n*n==k)
return 1;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if((i+j)*n-i*j==k)
ans+=Combination(n,i)*Combination(n,j);
}
}
return ans;
}
//C(m,n)
private static int Combination(int n, int k) {
if (k == 0 || k == n)
return 1;
else
return Combination(n - 1, k) + Combination(n - 1, k - 1);
}
}