AcWing 1026. 乘积最大(dfs迭代更新)

这是一个关于数字串分割的问题,目标是找到最佳的分割方式,使得分割后的数字串乘积最大。通过深度优先搜索(DFS)策略,对数字串进行分段,并在每一步中更新最大乘积。算法的时间复杂度较低,适用于数据范围较小的情况。代码中使用C++实现,通过递归遍历所有可能的分割方案,最终找到并输出最大乘积。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

在这里插入图片描述

题目描述

给定一个数字串,经过k次分割为k+1份,问各个部分累乘的最大值是多少?

样例

有一个数字串:312, 当 N=3,K=1 时会有以下两种分法:

1)3*12=36

2)31*2=62

这时,符合题目要求的结果是:31*2=62。


思路:

相当于在 上一题 基础上顺便迭代一个额外信息

将数字串长度n分为k+1个数字相加,搜索出每一种情况,(可以参考: AcWing 4181. 数的划分,过程几乎一致的,但本题还有所削弱,上一题数据范围更大 )

比如当n=4,k=2时可以搜索出这三种情况:

4 = 1 + 1 +2,4 = 1 + 2 + 1,4 = 2 + 1 + 1

知道了k+1部分每个部分的长度,我们方便将数组串进行分割成k+1个数字,将这些数字求乘积,就得到了一个答案

迭代上面搜出的乘积,用一个全局变量res更新最大值

算法

(dfs)

数据范围很小,建议用暴力搜索。

注意:

字符串string转成int可以用stoi,截取出子串用substr(idx, len)

C++ 代码
#include<bits/stdc++.h>

using namespace std;
int n, k;
string num;
int path[10];
int tt = 0;
int res = -1;

void dfs(int cnt, int sum)//cnt表示分成了几个部分,sum表示各部分之和
{
        if(cnt==k+1)
        {
                if(sum==n)
                {
                        int ans = 1;
                        int i=0;
                        for(int j=1;j<=tt;++j)
                        {
                                ans*=stoi(num.substr(i, path[j]));
                                i=i+path[j];
                        }
                        res = max(res, ans);
                }
                return ;
        }
        for(int i=1;i<=n;++i)
        {
                path[++tt] = i;
                dfs(cnt+1, sum+i);
                --tt;
        }
}

int main()
{
        cin>>n>>k;
        cin>>num;
        dfs(0, 0);//当前分出了0个部分,当前各部分之和为0
        cout<<res<<endl;
        return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值