Título Descripción
robot de Planeta X tiene dos actuaciones porristas ropa, A y B.
Muestran que los robots tomen la torre.
similar:
A
B B
ABA
AABB
BBBAB
ababba
Torre Grupo gobierna equipo es:
Un hombro sólo puede soportar de AA o BB.
B puede estar parado en los hombros de la AB o BA.
Su tarea es ayudar a los animadores calculan, cuando el número de B dado A, cuántos trucos pueden estar compuestos de la torre.
Entrada de línea dos enteros M y N, separados por espacios (0 <M, N <500), respectivamente, representan el número de A, B, para asegurar el número de racionalidad.
Un número entero de salida requerida representa el número de tipos de patrones se pueden generar.
De entrada
de línea de entrada dos enteros M y N, separados por espacios (0 <M, N <500 ), respectivamente, representan el número de A, B, para asegurar el número de racionalidad.
Output
requiere la salida un entero que representa el número de tipos de patrones se pueden generar.
Muestra de entrada
12
de salida de la muestra
3
Ideas: Partimos de arriba hacia abajo análisis, para las cadenas de la orden de la línea, si se determina el comienzo, a continuación, este último también determinada, y por lo tanto clasificado discusiones sobre el mismo.
Código es el siguiente:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,m;
inline ll dfs(int a,int b,int len,string s)
{
if(a==0&&b==0) return 1ll;
if(len==0) return dfs(a-1,b,1,"A")+dfs(a,b-1,1,"B");
else
{
string t="";
int c=a,d=b;
ll sum=0;
if(s[0]=='A')
{
if(c>=2)
{
t+="AA";c-=2;
for(int i=1;i<s.length();i++)
{
if(s[i]=='A'&&t[i-1]=='A'&&c) t+='A',c--;
else if(s[i]=='A'&&t[i-1]=='B'&&d) t+='B',d--;
else if(s[i]=='B'&&t[i-1]=='A'&&d) t+='B',d--;
else if(s[i]=='B'&&t[i-1]=='B'&&c) t+='A',c--;
}
if(t.length()==len+1) sum+=dfs(c,d,len+1,t);
c=a,d=b,t="";
}
if(d>=2)
{
t+="BB";d-=2;
for(int i=1;i<s.length();i++)
{
if(s[i]=='A'&&t[i-1]=='A'&&c) t+='A',c--;
else if(s[i]=='A'&&t[i-1]=='B'&&d) t+='B',d--;
else if(s[i]=='B'&&t[i-1]=='A'&&d) t+='B',d--;
else if(s[i]=='B'&&t[i-1]=='B'&&c) t+='A',c--;
}
if(t.length()==len+1) sum+=dfs(c,d,len+1,t);
c=a,d=b,t="";
}
}
c=a,d=b,t="";
if(s[0]=='B')
{
if(c&&d)
{
t+="AB";c--,d--;
for(int i=1;i<s.length();i++)
{
if(s[i]=='A'&&t[i-1]=='A'&&c) t+='A',c--;
else if(s[i]=='A'&&t[i-1]=='B'&&d) t+='B',d--;
else if(s[i]=='B'&&t[i-1]=='A'&&d) t+='B',d--;
else if(s[i]=='B'&&t[i-1]=='B'&&c) t+='A',c--;
}
if(t.length()==len+1) sum+=dfs(c,d,len+1,t);
c=a,d=b,t="";
t+="BA";c--,d--;
for(int i=1;i<s.length();i++)
{
if(s[i]=='A'&&t[i-1]=='A'&&c) t+='A',c--;
else if(s[i]=='A'&&t[i-1]=='B'&&d) t+='B',d--;
else if(s[i]=='B'&&t[i-1]=='A'&&d) t+='B',d--;
else if(s[i]=='B'&&t[i-1]=='B'&&c) t+='A',c--;
}
if(t.length()==len+1) sum+=dfs(c,d,len+1,t);
c=a,d=b,t="";
}
}
return sum;
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
printf("%lld\n",dfs(n,m,0,""));
}
return 0;
}
Para abastecerse de combustible ah, ( O ) / ~