链接

题意:

给出字符串长度n,一个数a,一个数b.然后将字符串拆分成两个数x,y,使得X%a=0,y%b=0

分析:

我们看数据范围都比较小,我们可以直接枚举每个数的余数,也就是 0~(a-1), 0~{b-1},那么我们就需要拿出两个维度来存放其余数,然后我们对于每一位i多有对应的两个余数,那么在开一维来存放到哪一位了。然后我们如果到达i位,并且连个余数出现过肯定就不用不用往后看了。当然我们还要记录那些位置放了什么。所以再开一维存放状态。

string str;
ll n,m;
ll a,b;
ll ans;
ll f[50],g[50];
ll dp[50][50][50][50];
void dfs(ll num,ll x,ll y,ll sum){
if(num == n){
if(x==0&&y==0&&sum>=1&&sum<n){
if(abs(n-sum*2)<ans){
ans=abs(n-2*sum);
for(int i = 0 ;i<n;i++) f[i]=g[i];
}
}
return ;
}
if(dp[num][x][y][sum]) return ;
dp[num][x][y][sum]=1;
g[num]=0;
dfs(num+1,(x*10+str[num]-'0')%a,y,sum+1);
g[num]=1;
dfs(num+1,x,(y*10+str[num]-'0')%b,sum);
}
void solve()
{
memset(dp,0,sizeof dp);
cin>>n>>a>>b;
cin>>str;
ans=1e18;
dfs(0, 0, 0, 0);
if(ans == 1e18){
puts("-1");
}else {
for(int i= 0 ;i<n;i++){
if(f[i]) cout<<"B";
else cout<<"R";
}
puts("");
}

}