3-动态规划求最小数字之和

给定一个包含MxN二维网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和最小。

这里需要特别注意的是dp数组的初始化和其数组意义,在思考时比较易混淆

package 算法;
import java.lang.Math;
public class 动态规划之二维路基最小值 {
    
    

	public static void main(String[] args) {
    
    
//		int array[][] = new int[3][3];// 动态初始化会自动的赋值0
//		int array[][] = {
    
    {1,2,1},{1,1,3},{3,1,1}};
		int array[][] = {
    
    {
    
    1,3,1},{
    
    1,5,1},{
    
    4,2,1}};
		int i=0,j=0;
		for(i=0;i<array.length;i++) {
    
    
			for(j=0;j<array[i].length;j++) {
    
    
				System.out.printf("%d ",array[i][j]);
			}
			System.out.println();
		}
		System.out.println("最短的路径是:"+fun(array));
	}
	static int fun(int array[][]) {
    
    
		int m = array.length;
		int n =array[0].length;
		System.out.println("m="+m+" n="+n);
		/*
		 * 1、定义dp数组并赋其意义
		 * 2、找见dp数组与原数组的关系
		 * 3、找出dp的初始值
		*/
		int dp[][] = new int[m][n];//dp[i][j]就是我走到这个点时的最小值
		/*可以知道的是他只能向下和向右行驶,那么他就有两种行驶路径,
		 *又因为只能选择最小的方式,那么就是会选择这一条路行驶
		 *得到一个公式:dp[i][j] = Math.min(dp[i-1][j], dp[i][j-1])+array[i][j]
		*/
		/*
		 * 关系式找见之后看初始值,当只有一行或者一列时,他dp数组的行驶路线也只能是一条
		*/
		dp[0][0] = array[0][0];//只有一步时也就是他自身长度
		for(int i=1;i<m;i++) {
    
    //第一列只能向下
			dp[0][i] = array[0][i]+dp[0][i-1];
		}
		for(int i=1;i<m;i++) {
    
    //第一行只能想右
			dp[i][0] = array[i][0]+dp[i-1][0];
		}
		System.out.println("dp初始化后是:");
		for(int i=0;i<m;i++) {
    
    
			for(int j=0;j<n;j++) {
    
    
				System.out.printf("%d ",dp[i][j]);
			}
			System.out.println();
		}
		for(int i=1;i<m;i++) {
    
    
			for(int j=1;j<n;j++) {
    
    
				dp[i][j] = Math.min(dp[i-1][j], dp[i][j-1])+array[i][j];
			}
		}
		System.out.println("dp赋值后:");
		for(int i=0;i<m;i++) {
    
    
			for(int j=0;j<n;j++) {
    
    
				System.out.printf("%d ",dp[i][j]);
			}
			System.out.println();
		}
		return dp[m-1][n-1];
	}

}

效果演示:
在这里插入图片描述

Guess you like

Origin blog.csdn.net/m0_46672781/article/details/120076892