[算法练习笔记] 3、dfs应用

文章讲解了如何通过DFS解决在给定数字串中插入适当乘号以求最大结果的问题,涉及代码实现和解题策略。
摘要由CSDN通过智能技术生成

题目描述

题目来源: 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;
 } 
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值