动态规划求最短路径

问题:寻找一条从左上角(a[0][0])到右下角(a[m-1][n-1])的路线,使得沿途经过的数组中的整数和最小。

方法一:递归法

  假设到a[i-1][j]与a[i][j-1]的最短路径和为f(i-1,j)和f(i,j-1),那么达到a[i][j]的路径上所有数字的最小值为

f(i,j)=min{f(i-1,j),f(i,j-1)}+a[i][j];由此可以采用递归的方法来实现,递归的约束条件为遍历到a[0][0]。在递归的过程中还应该考虑到特殊的情况:遍历到a[i][j](i=0或j=0)的时候,智能沿着固定的路径倒着往回找直到a[0][0].从a[m-1][n-1]逆向递归求解。

方法二:动态规划法

  动态规划是一种用时间来换取空间的算法,通过缓存计算的中间值,从而减少重复计算的次数,提高算法的效率。从a[0][0]正向求解。使用一个新的二维数组保存计算的中间结果。

package com.wyl;
/**
 * 寻找一条从左上角(a[0][0])到右下角(a[m-1][n-1])的路线,
 * 使得沿途经过的数组中的整数和最小
 * @author wyl
 *
 */
public class Test {

    /**
     * 使用动态规划法,用空间换取时间的算法,将中间结果进行存储
     */
    public static int minPath(Integer[][] a){
        int row = a.length;
        int col = a[0].length;
        if(row == 0 && col == 0){
            return -1;
        }
        Integer[][] newArray = new Integer[row][col]; //保存中间结果
        newArray[0][0] = a[0][0];
        for(int i=1;i<col;i++){
            newArray[0][i] = newArray[0][i-1] + a[0][i];
        }
        
        for(int i=1;i<row;i++){
            newArray[i][0] = newArray[i-1][0] + a[i][0];
        }
        for(int i=1;i<row;i++){
            for(int j=1;j<col;j++){
                if(newArray[i-1][j] < newArray[i][j-1]){
                    newArray[i][j] = newArray[i-1][j] + a[i][j];
                    System.out.println("[" + (i-1) + "," + j + "]" );
                }else{
                    newArray[i][j] = newArray[i][j-1] + a[i][j];
                    System.out.println("[" + i + "," + (j-1) + "]" );
                }
            }
        }
        System.out.println("[" + (row-1) + "," + (col-1) + "]" );
        return newArray[row-1][col-1];
    }
    
    
    public static void main(String[] args) {
        Integer[][] a = {
                {1,4,3},
                {8,7,5},
                {2,1,5}};
        int min = minPath(a);
        System.out.println("最小值为:" + min);
    }
}

 

转载于:https://www.cnblogs.com/studyDetail/p/7227521.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值