【算法 动态规划】 带权值的最小路径和 ,给定一个由非负整数填充的m x n的二维数组,现在要从二维数组的左上角走到右下角,请找出路径上的所有数字之和最小的路径。 注意:你每次只能向下或向右移动。

学习目标:

目标:学习动态规划相关知识


学习内容:

本文内容:带权值的最小路径和


题目描述

给定一个由非负整数填充的m x n的二维数组,现在要从二维数组的左上角走到右下角,请找出路径上的所有数字之和最小的路径。
注意:你每次只能向下或向右移动。

示例1

输入
[[1,2],
[5,6],
[1,1]]
返回值:8

与本题类似的题目:

  1. 在无障碍的矩阵中求路径
  2. 在有障碍的矩阵中求路径总和

解题思路

动态规划题目,首先需要分析出状态状态转移方程初始状态

  • 状态

子状态:从(0,0)到达(1,0),(1,1),(2,1),…(m-1,n-1)的最短路径
F(i,j):从(0,0)到达F(i,j)的最短路径

  • 状态转移方程

F(i,j)=F(i,j)+min(F(i,j-1),F(i-1,j))

  • 初始状态

F(0,0) = (0,0)
F(0,i) = F(0,i-1) + (0,i)
F(i,0) = F(i-1,0) + (i,0)

  • 返回结果:

F(m-1,n-1)

实现代码

public class PathSum_3 {
    public int minPathSum (int[][] matrix) {
        // write code here
        int line =matrix.length;
        if(line==0){
            return 0;
        }
        int list=matrix[0].length;
        int[][] res=new int[line][list];//存放当前位置的最小路径和
        for(int i=0;i<line;i++){
            //初始化第一列
            if(i==0){
                res[i][0]=matrix[i][0];
            }
            else{
                res[i][0]=res[i-1][0]+matrix[i][0];
            }
        }
        for(int i=1;i<list;i++){
            //初始化第一行
            res[0][i]=res[0][i-1]+matrix[0][i];
        }
        for(int i=1;i<line;i++){
            for(int j=1;j<list;j++){
                //状态转移方程: F(i,j)=F(i,j)+min(F(i,j-1),F(i-1,j))
                res[i][j]=Math.min(res[i-1][j],res[i][j-1])+matrix[i][j];
            }
        }
        return res[line-1][list-1];
    }
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值