题意
X星球的机器人表演拉拉队有两种服装,A和B。
他们这次表演的是搭机器人塔。
类似:
A
B B
A B A
A A B B
B B B A B
A B A B B A
队内的组塔规则是:
A 只能站在 AA 或 BB 的肩上。
B 只能站在 AB 或 BA 的肩上。
你的任务是帮助拉拉队计算一下,在给定A与B的人数时,可以组成多少种花样的塔。
输入一行两个整数 M 和 N,空格分开(0<M,N<500),分别表示A、B的人数,保证人数合理性。
要求输出一个整数,表示可以产生的花样种数。
例如:
用户输入:
1 2
程序应该输出:
3
再例如:
用户输入:
3 3
程序应该输出:
4
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
解题思路
搜了好久都没有搜到官方题解,貌似数据大了都会超。
对于机器人塔,只要最下面一行确定了,其余的都确定了,所以暴力枚举最后一行的情况,然后统计每种情况下的A,B字符数目,判断是否满足条件。
感觉可以剪枝,想不出来………….
代码实现
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 50
int ans=0,row;
int m,n;
char s1[maxn],s2[maxn];
void judge()
{
int numa=0,numb=0;
int z=row;
strcpy(s2+1,s1+1);
while(z)
{
for(int i=1;i<=z;i++)
if(s2[i]=='A')
numa++;
else
numb++;
z--;
for(int i=1;i<=z;i++)
if(s2[i]==s2[i+1])
s2[i]='A';
else
s2[i]='B';
}
if(numa==m&&numb==n)
ans++;
}
void dfs(int cur)
{
if(cur==row+1)
{
judge();
return ;
}
s1[cur]='A';
dfs(cur+1);
s1[cur]='B';
dfs(cur+1);
}
int main()
{
scanf("%d %d",&m,&n);
int i=1;
while((i*i+i)/2!=m+n)
i++;
row=i;
dfs(1);
printf("%d\n",ans);
return 0;
}