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-动态规划求最小数字之和的主要内容,如果未能解决你的问题,请参考以下文章

Excel规划求解求哪几个数字之和等于一个固定值

动态规划的题目特点以及求“硬币个数最少”

求正数数组的最小不可组成和 --- 背包问题(动态规划)

求正数数组的最小不可组成和 --- 背包问题(动态规划)

棋盘型动态规划的典例

用C语言求一个4以内正整数的各位数字之和