動態規劃(一):矩陣取數問題

1、問題描述

給定一個m行n列的矩陣,矩陣每一個元素是一個正整數,你如今在左上角(第一行第一列),你須要走到右下角(第m行,第n列),每次只能朝右或者下走到相鄰的位置,不能走出矩陣。走過的數的總和做爲你的得分,求最大的得分。 java

   

2、分析

  1. 定義

    二維數組A[][]表示矩陣(下標從1開始) 數組

    f(int x,int y)表示從起點到第x行第y列的最優路徑上的數之和 spa

   

  1. 遞推式:

   

下標從1開始,第0行或第0列不存在 3d

f(1, 1)是起點,沒得選 blog

從起點達到(x,y)的最優路徑要通過(x – 1,y)或者(x,y – 1),從起點到達(x – 1,y)或者(x,y – 1)的路徑必定也必須是最優的。兩者中取較大的 it

  1. 列表

    最大得分只有一個,但最優路徑不是惟一的:當f(x – 1,y) = f(x, y – 1)時,前一個位置在上面或者左面均可以(獲得的分數都是最大),因此路徑仍是不少不少的 class

  2. 複雜度:

    時間複雜度和空間複雜度都是O(m*n)import

3、例題

  1. 題目

    輸入 變量

    第1行:N,N爲矩陣的大小。(2 <= N <= 500) im

    第2 - N + 1行:每行N個數,中間用空格隔開,對應格子中獎勵的價值。(1 <= N[i] <= 10000)

       

    輸出

    輸出可以得到的最大價值。

       

    輸入示例

    3

    1 3 3

    2 1 3

    2 2 1

       

    輸出示例

    11

  2. 代碼

    import java.util.*;

       

    public class Main {

    public static void main(String[] args) {

    /* 輸入 */

    Scanner sc = new Scanner(System.in);

    int n = sc.nextInt();

    int[][] arr = new int[n+1][n+1];

    int[][] max = new int[n+1][n+1];

       

    for(int i = 1; i <= n ; i++){

    for (int j = 1; j <= n; j++) {

    arr[i][j] = sc.nextInt();//賦值給某個變量

    }

    }

    for(int i = 1; i <= n ; i++){

    for (int j = 1; j <= n; j++) {

    if (i == 1 && j == 1){

    max[i][j] = arr[i][j];

    }

    else{

    max[i][j] = Math.max(max[i-1][j],max[i][j-1])+arr[i][j];

    }

    }

    }

    System.out.println(max[n][n]);

    }

    }

相關文章
相關標籤/搜索