题解 | #最长不含重复字符的子字符串#
礼物的最大价值
http://www.nowcoder.com/practice/2237b401eb9347d282310fc1c3adb134
max2更好理解
确定坐标(i,j) 最大值只与上边(i-1,j)和左边(i,j-1)的值有关系,动态规划求解。
//横为i,列为j
public int max(int[][] grid){
if(grid==null||grid.length==0){return 0;}
int m=grid.length;
int n=grid[0].length;
//改装一位数组
int[] dp=new int[n+1];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
dp[j+1]=Math.max(dp[j],dp[j+1])+grid[i][j];
}
}
return dp[n];
}
public int max2(int[][] grid){
if(grid==null||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 = 0; i < n; i++) {
dp[0][i]=dp[0][i-1]+grid[0][i];
}
for (int i = 0; i < m; i++) {
dp[i][0]=dp[i-1][0]+grid[i][0];
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1])+grid[i][j];
}
}
return dp[m-1][n-1];
}