64. 最小路径和
class Solution {
public int minPathSum ( int [ ] [ ] grid) {
int n= grid. length;
int m= grid[ 0 ] . length;
int [ ] [ ] dp= new int [ n] [ m] ;
dp[ 0 ] [ 0 ] = grid[ 0 ] [ 0 ] ;
for ( int i= 0 ; i< n; i++ ) {
for ( int j= 0 ; j< m; j++ ) {
if ( i== 0 && j== 0 ) continue ;
if ( i== 0 && j!= 0 ) {
dp[ i] [ j] = dp[ i] [ j- 1 ] + grid[ i] [ j] ;
} else if ( j== 0 && i!= 0 ) {
dp[ i] [ j] = dp[ i- 1 ] [ j] + grid[ i] [ j] ;
} else {
dp[ i] [ j] = Math . min ( dp[ i- 1 ] [ j] , dp[ i] [ j- 1 ] ) + grid[ i] [ j] ;
}
}
}
return dp[ n- 1 ] [ m- 1 ] ;
}
}
剑指 Offer II 095. 最长公共子序列
class Solution {
public int longestCommonSubsequence ( String text1, String text2) {
int n= text1. length ( ) ;
int m= text2. length ( ) ;
int [ ] [ ] dp= new int [ n+ 1 ] [ m+ 1 ] ;
for ( int i= 1 ; i< n+ 1 ; i++ ) {
for ( int j= 1 ; j< m+ 1 ; j++ ) {
if ( text1. charAt ( i- 1 ) == text2. charAt ( j- 1 ) ) {
dp[ i] [ j] = dp[ i- 1 ] [ j- 1 ] + 1 ;
} else {
dp[ i] [ j] = Math . max ( dp[ i] [ j- 1 ] , dp[ i- 1 ] [ j] ) ;
}
}
}
return dp[ n] [ m] ;
}
}