3-动态规划求最小数字之和
Posted 勇敢*牛牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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];
}
}
效果演示:
以上是关于3-动态规划求最小数字之和的主要内容,如果未能解决你的问题,请参考以下文章