CF 1593 F. Red-Black Number (搜索)

该博客探讨了一种字符串拆分方法,目的是找到两个整数x和y,使得x除以a和y除以b的余数都是0。通过枚举每个数的余数,博主使用动态规划策略解决此问题,对于每个字符,尝试将其分配给x或y,以满足条件。在给定的数据范围内,博主成功实现了算法,并给出了输出结果的示例。
摘要由CSDN通过智能技术生成

链接

题意:

给出字符串长度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("");
    }
 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值