题目:
在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物?
解答:
使用动态规划,f(i,j)表示到达坐标[i,j]时能拿到的最大礼物总和。则当前格子f(i,j)可由左边格子f(i-1,j)或f(i,j-1)上面格子到达。因此,递归式子为:
f(i,j)=max(f(i−1,j),f(i,j−1))+gift[i,j]
1 public class Solution { 2 3 public static void main(String[] args) { 4 int[][] values = { 5 {1,2,3}, 6 {4,5,6}, 7 {7,8,9} 8 }; 9 10 System.out.println(getMaxPathValue(values));11 }12 13 private static int getMaxPathValue(int[][] values) {14 if(values == null) {15 return 0;16 }17 18 int rows = values.length;19 if(rows <= 0) {20 return 0;21 }22 23 int cols = values[0].length;24 if(cols <= 0) {25 return 0;26 }27 28 int[][] maxValues = new int[rows][cols];29 for(int i = 0; i < rows; i++) {30 for(int j = 0; j < cols; j++) {31 32 int left = 0;33 int up = 0;34 35 if(i > 0) {36 up = maxValues[i-1][j];37 }38 39 if(j > 0) {40 left = maxValues[i][j-1];41 }42 43 maxValues[i][j] = Math.max(up, left) + values[i][j];44 }45 }46 47 return maxValues[rows-1][cols-1];48 49 }50 }