【蓝桥】算法 《拿金币》

博主分享了自己在蓝桥算法挑战《拿金币》中遇到的问题,使用回溯算法实现的解决方案只能通过一个测试用例,其余9个因超时未通过。博主寻求关于回溯算法中剪枝技巧的建议,以减少递归深度并成功通过所有测试。欢迎大家提供指导和讨论。

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

【蓝桥】算法 《拿金币》

下面是我本人写的回溯算法,但是只有一个测试用例能通过,其他9个均超时,拜托各位大佬指点关于回溯中剪枝的操作,来降低递归深度并通过蓝桥OJ,同时也欢迎一起探讨!😃 😃 😃

import java.util.*;
public class _拿金币 {
	public static int sum = 0;
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int[][] money = new int[n][n];
		for (int i = 0; i < n; ++i) {
			for (int j = 0; j < n; ++j) {
				money[i][j] = sc.nextInt();
			}
		} 	
		dfs(money, 0, 0, 0);
		System.out.println(sum);
	}
	// timeout 如何剪枝??
	public static void dfs(int[][] m, int i, int j, int s) { // 使用回溯向下递归
		if (i < 0 || i >= m.length || j < 0 || j >= m.length
				|| j == m.length && i == m.length) {
			sum = Math.max(sum, s);
			return;
		}

		s += m[i][j];
		dfs(m, i+1,j, s);
		dfs(m, i, j+1, s);
		s -= m[i][j];
	}
}

测试用例运行结果:

1. 绿色为测试用例,黑色为运行结果

在这里插入图片描述

2. 绿色为测试用例,黑色为运行结果

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值