Java实现最小路径和(动态规划)

话不多说,直接上代码package cn.texous.demo.test;import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Random;/** * Java实现最小路径和(动态规划) * * @author Showa.L * @since 202
摘要由CSDN通过智能技术生成
话不多说,直接上代码
package cn.texous.demo.test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

/**
 * Java实现最小路径和(动态规划)
 *
 * @author Showa.L
 * @since 2021/1/6 15:35
 */
public class TestShortWay {
   

    /**
     * 给定一个包含非负整数的 column x row 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
     * <p>
     * 说明:每次只能向下或者向右移动一步。
     * <p>
     * 示例:
     * <p>
     * 输入:
     * [
     * [1,3,1],
     * [1,5,1],
     * [4,2,1]
     * ]
     * 输出: 7
     * 解释: 因为路径 1→3→1→1→1 的总和最小。
     * <p>
     * 具有相同值路径数组
     * [
     * [16, 22, 2,  4,  0],
     * [5,  17, 7,  12, 18],
     * [10, 11, 21, 8,  14],
     * [15, 9,  13, 1,  23],
     * [20, 6,  19, 3,  24]
     * ]
     */
    public static void main(String[] args) {
   
        int row = 5, column = 5;
        Integer[][] integer = generatorArray(row, column);
        // 获取其中一条, 可能存在和相同的情况会被舍弃
        minimumPlannedPathOne(row, column, integer);
        // 获取其中的所有,可能存在和相同的情况
        minimumPlannedPathAllFirst(row, column, integer);
        // 提取判断条件到循环外
        minimumPlannedPathAllSecond(row, column, integer);
    }

    /**
     * 动态规划,获取所有规划路径,方法二
     *
     * @param row     行数
     * @param column  列数
     * @param integer 数组
     */
    private static void minimumPlannedPathAllSecond(int row, int column, Integer[][] integer) {
   
        Integer[][] min = new Integer[row][column];
        Map<String, List<String>> way = new HashMap<>();
        min[0][0] = integer[0][0];
        way.put("0,0", Collections.singletonList("0,0"));
        for (int r = 1; r < row; r++) {
   
            min[r][0] = integer[r][0] + min[r - 1][0];
            String preWay = (r - 1) + ",0";
            String point = r + ",0";
            way.put(point, generatePlannedPath(way.get(preWay), point));
        }
        for (int c = 1; c < column; c++) {
   
            min[0][c] = integer[0][c] + min[0][c - 1];
            String preWay = "0," + (c - 1);
            String point = "0," + c;
            way.put(point, generatePlannedPath(way.get(preWay), point));
        }
        for (int r = 1; r < row; r++) {
   
            for (int c = 1; c < column; c++) {
   
                String point = r + "," + c;
                int minValue = Math.min(min[r][c - 1], min[r - 1][c]);
                min[r][c] = integer[r][c] + minValue;
                String preWay 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值