这是一个典型的动态规划的问题,我们先用递归的的思路来分析。我们先定义第一个函数f(i,j)表示打到坐标为i,j的各自时,能拿到的礼物总和的最大值,
根据题目要求,我们有两种可能的途径到达坐标为i,j的格子;通过格子(i-1,j)或者是(i,j-1)。所以f(i,j) = max(f(i-1,j),f(i,j-1))+ girf[i,j]
尽管我们用递归来分析问题,但由于有大量重复的计算,导致递归的代码并不是最优的,相对而言,基于循环的代码效率要高很多。为了缓存中间计算结构,我们需要一个辅助的二维数组。数组中坐标为(i,j)的元素表示到达坐标为(i,j)的格子时能拿到的礼物价值总和的最大值
package question47_find_max_girft;
/**
* @Classname Solution
* @Description TODO
* @Date 2020/3/28 22:19
* @Created by mmz
*/
public class Solution {
public static int getMaxGirft(int[][] number){
int row = number.length;
int col = number[0].length;
int[] maxValue = new int[col];
for(int i =0;i<row;++i){
for(int j =0;j<col;++j){
int up = 0;
int left = 0;
if(i>0){
up = maxValue[j];
}
if(j>0){
left = maxValue[j-1];
}
maxValue[j] = Math.max(up,left)+number[i][j];
}
}
return maxValue[col-1];
}
public static void main(String[] args) {
int[][] number = new int[][]{{1,10,3,8},{12,2,9,6},{5,7,4,11},{3,7,16,5}};
System.out.println(getMaxGirft(number));
}
}
一次动态规划