题目信息
输入:n (1<n<=23)
输出不同方案的个数
测试样例
3
4
解答
#include<iostream>
#include<algorithm>
#define MAXN 24
using namespace std;
int n;
int triangle[MAXN][MAXN];
int half;
int counts;
int ans;
void dfs(int ceng)
{
if (counts > half || (ceng * (ceng - 1) / 2 - counts) > half)
{//如果1或者0的个数已经大于half了说明不合适,就可以不考虑了
return;
}
if (ceng > n)
{//结束了
if (counts == half)
{
ans++;
}
return;
}
for (int i = 0; i <= 1; i++)
{//每次只有两种选择
triangle[1][ceng] = i;
counts += i;
for (int j = 2; j <= ceng; j++)
{//根据01规定补全下面的数字
triangle[j][ceng - j + 1] = triangle[j - 1][ceng - j + 1] ^ triangle[j - 1][ceng - j + 2];
counts += triangle[j][ceng - j + 1];
}
dfs(ceng + 1);//再深入一层
for (int j = 2; j <= ceng; j++)
{//把之前计算的都退掉
counts -= triangle[j][ceng - j + 1];
}
counts -= i;
}
}
int main()
{
cin >> n;
half = n * (n + 1) / 2;
if (half % 2 == 1)
{
cout << 0 << endl;
}
else
{
half /= 2;
dfs(1);
cout << ans << endl;
}
return 0;
}
想法
存在N行的三角形,符号总个数为n * (n + 1) / 2
,那么0,1的个数都不能超过n * (n + 1) / 4
,因为两个个数要想等。
- sum累计+ -个数相同的符号三角形个数
- 若n*(n+1)/2是奇数,则sum=0,返回
- count累计当前符号三角形中1的个数