1. 程式人生 > >劍指offer47題

劍指offer47題

pri length 方程 列數 規劃 code ++ cor span

  題目:在一個mXn的棋盤的每一格放有一個禮物,每個禮物都有一定的價值(價值大於0)。你可以從棋盤的左上角開始拿格子裏的禮物,並每次向左或者向下移動一格,直到到達棋盤的右下角。給定一個棋盤及其上面的禮物,請計算你最多能拿到多少價值的禮物?

1   10   3   8

12   2   9   6

5   7   4   11

3   7   16  5

可以看到,價值最大的就是,1->12->5->7->7->16->5。即標下劃線的數字。

那麽現在,最好的方法就是動態規劃了。這就是一道非常簡單的動態規劃。

首先用一個二維數組,保存每一步的值,然後不停的循環。動態方程:f(i,j) = Max(f(i-1,j),f(i,j-1))+gift(i,j)

當然,還有優化的方法,但現在先給出最簡單的。看代碼吧。

package com.algorithm04;

public class Algorithm47 {
    
    public int MaxMartix(int[][] matrix){
        
        int row,col;
        //行數
        row = matrix.length;
        //列數
        col = matrix[0].length;
        int MaxValue[][] = new int[row][col];
        for(int
i = 0 ; i < row ; i++) for(int j = 0 ; j < col ;j++) { int left,up; left = up = 0; //當前位置的左邊和上邊的最大值 int maxvalue; if(i>0) { //求i,j上邊的值 up = MaxValue[i-1][j]; }
if(j>0) { //求i,j左邊的值 left = MaxValue[i][j-1]; } //取出最大值 maxvalue = max(left,up); //最大值加上當前位置的值 MaxValue[i][j] = maxvalue + matrix[i][j]; } return MaxValue[row-1][col-1]; } //返回i,j中的最大值 private int max(int i, int j){ return i>j?i:j; } public static void main(String[] args) { int[][] matrix = new int[][]{{1,10,3,8},{12,2,9,6},{5,7,4,11},{3,7,16,5}}; Algorithm47 algorithm47 = new Algorithm47(); int max = algorithm47.MaxMartix(matrix); System.err.println(max); } }

劍指offer47題