64. 最小路径和
class Solution {public int minPathSum(int[][] grid) {if(grid.length==0) return 0;int m=grid.length;int n=grid[0].length;int[][] dp=new int[m][n];dp[0][0]=grid[0][0];for(int i=1;i<m;i++){dp[i][0]=dp[i-1][0]+grid[i][0];}for(int j=1;j<n;j++){dp[0][j]=dp[0][j-1]+grid[0][j];}for(int i=1;i<m;i++){for(int j=1;j<n;j++){dp[i][j]=Math.min(dp[i][j-1],dp[i-1][j])+grid[i][j];}}return dp[m-1][n-1];}}
931. 下降路径最小和
题解
dp[i][j]表示落到matrix[i][j]这个点的最小路径和。
首先,终点可能在最后一行的任意一列
for (int j = 0; j < n; j++) {res = Math.min(res, dp[n-1][j]);}
其次,因为只能从相邻列下落,所以每个格子只能从上一行的三个或两个(边界)获取前一步的最小值。如下图:
class Solution {public int minFallingPathSum(int[][] matrix) {int n=matrix.length;if(n==1) return matrix[0][0];int[][] dp=new int[n][n];int res=Integer.MAX_VALUE;for(int j=0;j<n;j++){dp[0][j]=matrix[0][j];}for(int i=1;i<n;i++){for(int j=0;j<n;j++){dp[i][j]=getMin(i,j,dp,n)+matrix[i][j];if(i==n-1){res=Math.min(res,dp[i][j]);}}}return res;}public int getMin(int i,int j,int[][] dp,int n){if(j-1<0){return Math.min(dp[i-1][j],dp[i-1][j+1]);}else if(j+1>=n){return Math.min(dp[i-1][j-1],dp[i-1][j]);}else{return Math.min(dp[i-1][j-1],Math.min(dp[i-1][j],dp[i-1][j+1]));}}}
72. 编辑距离

class Solution {public int minDistance(String word1, String word2) {int l1=word1.length();int l2=word2.length();int[][] dp =new int[l1+1][l2+1];for(int i=1;i<=l1;i++){dp[i][0]=dp[i-1][0]+1;}for(int j=1;j<=l2;j++){dp[0][j]=dp[0][j-1]+1;}for(int i=1;i<=l1;i++){for(int j=1;j<=l2;j++){if(word1.charAt(i-1)==word2.charAt(j-1)){dp[i][j]=dp[i-1][j-1];}else{dp[i][j]=Math.min(dp[i-1][j-1],Math.min(dp[i-1][j],dp[i][j-1]))+1;}}}return dp[l1][l2];}}
