标签:定义 image pre 节点 简单 情况 抽象 oid ==
private int minDist = Integer.MAX_VALUE; // 全局变量或者成员变量 // 调用方式:minDistBacktracing(0, 0, 0, w, n); public void minDistBT(int i, int j, int dist, int[][] w, int n) { // 到达了n-1, n-1这个位置了,这里看着有点奇怪哈,你自己举个例子看下 if (i == n && j == n) { if (dist < minDist) minDist = dist; return; } if (i < n) { // 往下走,更新i=i+1, j=j minDistBT(i + 1, j, dist+w[i][j], w, n); } if (j < n) { // 往右走,更新i=i, j=j+1 minDistBT(i, j+1, dist+w[i][j], w, n); } }
画出一个二维状态表
public int minDistDP(int[][] matrix, int n) { int[][] states = new int[n][n]; int sum = 0; for (int j = 0; j < n; ++j) { // 初始化states的第一行数据 sum += matrix[0][j]; states[0][j] = sum; } sum = 0; for (int i = 0; i < n; ++i) { // 初始化states的第一列数据 sum += matrix[i][0]; states[i][0] = sum; } for (int i = 1; i < n; ++i) { for (int j = 1; j < n; ++j) { states[i][j] = matrix[i][j] + Math.min(states[i][j-1], states[i-1][j]); } } return states[n-1][n-1]; }
状态转移方程法
类似递归的解题思路。我们需要分析,某个问题如何通过子问题来递归求解,也就是所谓的最优子结构。
根据最优子结构,写出递归公式,也就是所谓的状态转移方程。有了状态转移方程,代码实现就非常简单了。
一般情况下,我们有两种代码实现方法,一种是递归加“备忘录”,另一种是迭代递推。
强调:状态转移方程是解决动态规划的关键,写出状态转移方程,问题就解决了一半!!
应用:解决上面的最短路径问题
状态转移方程:
min_dist(i, j) = w[i][j] + min(min_dist(i, j-1), min_dist(i-1, j))
实现代码
private int[][] matrix = {{1,3,5,9}, {2,1,3,4},{5,2,6,7},{6,8,4,3}}; private int n = 4; private int[][] mem = new int[4][4]; public int minDist(int i, int j) { // 调用minDist(n-1, n-1); if (i == 0 && j == 0) return matrix[0][0]; if (mem[i][j] > 0) return mem[i][j]; int minLeft = Integer.MAX_VALUE; if (j-1 >= 0) { minLeft = minDist(i, j-1); } int minUp = Integer.MAX_VALUE; if (i-1 >= 0) { minUp = minDist(i-1, j); } int currMinDist = matrix[i][j] + Math.min(minLeft, minUp); mem[i][j] = currMinDist; return currMinDist; }
标签:定义 image pre 节点 简单 情况 抽象 oid ==
原文地址:https://www.cnblogs.com/wod-Y/p/12146673.html