【华为OD题库-010】寻找矿堆的最大价值-Java

题目

给你一个由0(空地)、1(银矿)、2(金矿)组成的的地图,矿堆只能由上下左右相邻的金矿或银矿连接形成。超出地图范围可以认为是空地。
假设银矿价值1,金矿价值2,请你找出地图中最大价值的矿堆并输出该矿堆的价值
输入描述
地图元素信息如:
22220
00000
00000
11111
地图范围最大300*300
0<=地图元素<=2
输出描述:
矿堆的最大价值
示例1
输入:
22220
00000
00000
01111
输出:
8
示例2
输入:
22220
00020
00010
01111
输出:
15
示例3
输入:
20000
00120
00000
00111
输出:
3

思路

遍历矿堆,如果当前值不等于0(等于1或等于2),那么从当前值计算,所有相邻的总价值是多少?
将本轮遍历产生的总价值和上次的总价值比较,得到较大值
遍历完成后,就能得到矿堆的最大价值
问题的关键在于怎么求所有相邻的总价值?根据题目描述,总价值等于=当前值+上总价值+下总价值+左总价值+右总价值。
设计 dfs(grid,i,j)函数,grid是一个二维数组,表示矿堆,(i,j)代表开始计算位置。
定义递归终止条件:如果i,j超出数组范围或者grid[i][j]==0,那么 直接返回0
定义结果res的初始值:res=grid[i][j]
递归计算与当前位置的相邻(上下左右四个位置)位置的累加价值,用res加上相邻的值
最后返回res即可

题解

package hwod;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class FindKMaxVal {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        List<String> list = new ArrayList<>();
        while (sc.hasNextLine()) {
            String line = sc.nextLine();
            if ("".equals(line)) break;
            list.add(line);
        }
        int n = list.size();
        int[][] pile = new int[n][list.get(0).length()];
        //字符数组转整形数组
        for (int i = 0; i < n; i++) {
            String line = list.get(i);
            for (int j = 0; j < line.length(); j++) {
                pile[i][j] = line.charAt(j) - '0';
            }
        }
        System.out.println(findMaxVal(pile));
    }

    private static int findMaxVal(int[][] pile) {
        int m = pile.length;
        int res = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < pile[i].length; j++) {
                if (pile[i][j] == 1 || pile[i][j] == 2) {
                    int cur = dfs(i, j, pile);
                    res = Math.max(res, cur);

                }
            }
        }
        return res;
    }

    private static int dfs(int i, int j, int[][] pile) {
        int m = pile.length, n = pile[0].length;
        if (i >= m || j >= n || i < 0 || j < 0 || (pile[i][j] != 1 && pile[i][j] != 2)) return 0;

        int res = pile[i][j];
        pile[i][j] = 0;
        res += dfs(i + 1, j, pile) + dfs(i, j + 1, pile) + dfs(i - 1, j, pile) + dfs(i, j - 1, pile);

        return res;
    }
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

说明

本专栏所有文章均为原创,欢迎转载,请注明文章出处:https://blog.csdn.net/qq_31076523/article/details/134176793。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
华为OD机试-最大化控制资源成本Java题目要求我们设计一个解决方案,以最大程度地控制资源成本。在Java中,我们可以通过以下方法来实现: 1. 使用线程池:Java提供了Executor框架,可以用来管理和重复利用线程。通过使用线程池,我们可以避免频繁地创建和销毁线程,从而节省了系统的资源开销。 2. 资源的动态管理:动态管理资源的使用是很重要的,我们可以通过合理分配资源的数量,最大化地控制资源成本。比如,可以根据当前系统的负载情况来动态调整线程池的大小,从而避免资源的浪费。 3. 内存的优化:在Java中,通过合理地利用内存,可以有效地节省资源成本。比如,可以使用缓存机制,将一些频繁访问的数据缓存在内存中,从而减少对数据库或其他资源的访问次数。 4. 避免资源泄漏:资源泄漏是很容易发生的,如果不及时释放资源,会导致资源的浪费和系统的崩溃。在Java的开发中,我们需要及时地释放所使用的资源,比如关闭文件、释放数据库连接等。 5. 使用轻量级的框架:在Java开发中,选择合适的框架也会对资源成本的最大化控制起到影响。轻量级的框架比如Spring Boot等,可以帮助我们减少额外的资源负担。 总之,通过合理地运用线程池、动态管理资源、优化内存、避免资源泄漏以及选择合适的框架,我们可以最大化地控制资源成本,提高系统的性能和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值