题目描述
题目来源: AcWing 3718. 插入乘号
给定一个长度为 n的数字串,向里面插入 k个乘号,输出可以得到的最大结果。
注意:插入乘号之后的每个数可以有前导0。
**输入格式**
第一行输入两个整数 n,k。
第二行输入长度为 n的一个数字序列。
**输出格式**
输出可以得到的最大结果。
**数据范围**
1≤k<n≤10
**输入样例:**
4 2
1234
**输出样例:**
144
解题过程
因为使用了dfs解题,故参考了B站dfs(迷宫求解实现)来了解dfs,可惜这道题的dfs思路还是有点不清楚,先ac吧,之后进行相关的知识点学习之后再来回顾这道题 = =
解题代码
#include<bits/stdc++.h> // 万能头
using namespace std;
typedef long long ll; // 将longlong类型简写为ll
int n, m; // 数字长度为n, 乘号数量为m
ll res; // 结果类型必须是ll,int会爆
string s; // 用string来接收输入的数字串
void dfs(int u, int sum, string p, ll ans) { // u:乘号位置,sum:乘号数量, p:因子, ans:累乘结果
if(u == n - 1) { // 如果乘号到了最后一个插入位置
if(sum == m) { // 乘号数量满足要求
ans *= stoll(p); // 将p换成ll类型再累乘上去
res = max(res, ans); // res取最大值
}
return; // 回溯
}
// u号位置填了乘号,所以累乘
dfs(u + 1, sum + 1, s.substr(u + 1, 1), ans * stoll(p));
// u号位置没填累乘,因子合并
dfs(u + 1, sum, p + s[u + 1], ans);
}
int main() {
cin >> n >> m >> s;
dfs(0, 0, s.substr(0, 1), 1);
cout << res;
return 0;
}