题目描述
给定一个数字串,经过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;
}