給定一個m行n列的矩陣,矩陣每一個元素是一個正整數,你如今在左上角(第一行第一列),你須要走到右下角(第m行,第n列),每次只能朝右或者下走到相鄰的位置,不能走出矩陣。走過的數的總和做爲你的得分,求最大的得分。 java
二維數組A[][]表示矩陣(下標從1開始) 數組
f(int x,int y)表示從起點到第x行第y列的最優路徑上的數之和 spa
① 下標從1開始,第0行或第0列不存在 3d
② f(1, 1)是起點,沒得選 blog
③ 從起點達到(x,y)的最優路徑要通過(x – 1,y)或者(x,y – 1),從起點到達(x – 1,y)或者(x,y – 1)的路徑必定也必須是最優的。兩者中取較大的 it
最大得分只有一個,但最優路徑不是惟一的:當f(x – 1,y) = f(x, y – 1)時,前一個位置在上面或者左面均可以(獲得的分數都是最大),因此路徑仍是不少不少的 class
時間複雜度和空間複雜度都是O(m*n)import
輸入 變量
第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
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]);
}
}