礼物的最大值
题目:
在一个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 }
积沙成塔