TH11 权值最大的路径

文章介绍了如何使用Java编程语言实现一个Solution类的digSum方法,解决给定向量图中从起点出发,寻找经过节点权值和最大的路径问题。方法利用邻接表结构和动态规划策略找到最优路径并返回其序列。

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

描述

给出一个有向无环图,规定路径是单向且小序号指向大序号,每个节点都有权值。在图上求一条路径使得经过的节点权值和最大,输出路径

示例1

输入:

[5,10,20,5,4,5],[[1,2],[1,4],[2,4],[3,4],[4,5],[4,6],[5,6]]

返回值:

"3-4-5-6"

说明:

很明显 先去第三点权值为20,再去第四个点权值为5,再去第五个点权值为4,再去第六个点权值为5。这个方案最优 

以下是Java代码实现:


import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param potatoNum int一维数组 依次表示序号为1,2,3..的节点的权值
     * @param connectRoad int二维数组 每个一维数组[x,y]表示从第x号到第y号有路
     * @return string
     */
    public String digSum(int[] potatoNum, int[][] connectRoad) {
        int n = potatoNum.length;
        List<List<Integer>> graph = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            graph.add(new ArrayList<>());
        }
        for (int[] road : connectRoad) {
            graph.get(road[0] - 1).add(road[1] - 1);
        }
        int[] maxSum = new int[n];
        int[] maxNode = new int[n];
        Arrays.fill(maxSum, Integer.MIN_VALUE);
        Arrays.fill(maxNode, -1);
        maxSum[0] = potatoNum[0];
        for (int i = 1; i < n; i++) {
            for (int j = 0; j < i; j++) {
                if (graph.get(j).contains(i)) {
                    int sum = maxSum[j] + potatoNum[i];
                    if (sum > maxSum[i]) {
                        maxSum[i] = sum;
                        maxNode[i] = j;
                    }
                }
            }
        }
        int maxIndex = 0;
        for (int i = 1; i < n; i++) {
            if (maxSum[i] > maxSum[maxIndex]) {
                maxIndex = i;
            }
        }
        StringBuilder sb = new StringBuilder();
        while (maxNode[maxIndex] != -1) {
            sb.insert(0, maxIndex + 1);
            sb.insert(0, "-");
            maxIndex = maxNode[maxIndex];
        }
        sb.insert(0, 1);
        return sb.toString();
    }
}

在这个实现中,我们定义了一个名为Solution的类,其中包含一个名为digSum的公共方法。该方法接收两个参数:一个名为potatoNum的整数数组,表示每个节点的权值;一个名为connectRoad的整数二维数组,表示从第x号到第y号有路。该方法返回一个字符串,表示经过的节点权值和最大的路径。

在方法中,首先定义了一个名为n的整数,表示节点的数量。然后定义了一个名为graphList<List<Integer>>,用于存储有向无环图的邻接表表示。接下来,使用一个for循环遍历connectRoad中的每个一维数组,将其添加到graph中。

接下来,定义了两个整数数组maxSummaxNode,分别表示从当前节点开始的最大权值和和前一个节点的索引。初始化时,将maxSum中的所有元素设置为Integer.MIN_VALUE,将maxNode中的所有元素设置为-1。然后,使用两个for循环遍历graph中的每个节点,计算从该节点开始的最大权值和。

最后,使用一个while循环从maxNode中找到最大权值和的路径,并将其添加到StringBuilder中。最后,返回StringBuilder中的字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清贫码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值