好的到了新的一学期复习的时候,我动态规划又几乎不会了,算法能力小于上学期。。
面试前复习剑指Offer路过,经过写题练习,这种简单的动态规划已经会了。看到下面的话,原来我当时这都不会哈哈哈哈,加油!以后看现在觉得难的东西应该也会觉得简单吧。
二刷路过,这次也想不到。只能想到dfs,还没下手就去看看别人的题解,原来用动态规划,盒盒盒。
1.思路
设f(i,j)为从棋盘左上角走至单元格(i,j)的礼物最大累计价值,得到以下递推关系:
f(i,j) 等于f(i,j−1) 和f(i−1,j) 中的较大值加上当前单元格礼物价值grid[i,j]
2.代码
class Solution {
public int maxValue(int[][] grid) {
int m=grid.length;
int n=grid[0].length;
for(int i=1;i<m;i++){
grid[i][0]+=grid[i-1][0];
}
for(int j=1;j<n;j++){
grid[0][j]+=grid[0][j-1];
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
grid[i][j]+=Math.max(grid[i-1][j],grid[i][j-1]);
}
}
return grid[m-1][n-1];
}
}
3.复杂度
时间O(M*N) 空间O(1)
4.结果
#超时写法
原来自己暴力的写超时了,看了题解,要用动态规划。
class Solution {
int m=0,n=0;
int go[][]={{0,1},{1,0}};
int value=0,max=0;
int[][] grid;
public int maxValue(int[][] grid) {
this.grid=grid;
m=grid.length;
n=grid[0].length;
dfs(0,0);
return max;
}
public void dfs(int x,int y){
//检查越界
if(test(x,y)==false){
return;
}
//加入当前价值
value+=grid[x][y];
//到右下角
if(x==m-1&&y==n-1){
if(value>max){
max=value;
}
return;
}
for(int i=0;i<2;i++){
if(test(x+go[i][0],y+go[i][1])){
dfs(x+go[i][0],y+go[i][1]);
value-=grid[x+go[i][0]][y+go[i][1]];
}
}
}
//检查越界
public boolean test(int x,int y){
if(x<0||y<0||x>=m||y>=n){
return false;
}
return true;
}
}