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];
}
}