###题目连接
- 思路 :
-
//状态表示 :f[i][j] 表示 从 (0,0) 开始 选择东或者南方的花生的所有方案 属性 max // 决策 : 选择 东 : f[i][j] += f[i - 1][j] + g[i][j]; // 选择 南 : f[i][j] += f[i][j - 1] + g[i][j]; // 都是 + g[i][j] , 决策 取 max 可以写为 f[i][j] = max(f[i - 1][j] , f[i][j - 1] ) + g[i][j];
import java.util.*;
public class Main {
static int[] dx = {1,0};
static int[] dy = {0,-1};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
while (t -- > 0) {
int r = sc.nextInt();
int c = sc.nextInt();
int[][] g = new int[r + 1][c + 1 ];
for(int i = 1 ; i <= r ; i ++ ){
for (int j = 1; j <= c ; j++ )
g[i][j] = sc.nextInt();
}
// 状态表示 :f[i][j] 表示 从 (1,1) 开始 选择东或者南方的花生的所有方案 属性 max
// 决策 : 选择 东 : f[i][j] += f[i - 1][j] + g[i][j];
// 选择 南 : f[i][j] += f[i][j - 1] + g[i][j];
// 都是 + g[i][j] , 决策 取 max 可以写为 f[i][j] = max(f[i - 1][j] , f[i][j - 1] ) + g[i][j];
int[][] f = new int[r + 1][c + 1];
for (int i = 1 ; i <= r ; i ++) {
for (int j = 1 ; j <= c ; j ++)
f[i][j] = Math.max(f[i - 1][j] , f[i][j - 1]) + g[i][j];
}
System.out.println(f[r][c]);
}
}
}
优化 : 滚动数组法
import java.util.*;
public class Main {
static int[] dx = {1,0};
static int[] dy = {0,-1};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
while (t -- > 0) {
int r = sc.nextInt();
int c = sc.nextInt();
int[][] g = new int[r + 1][c + 1 ];
for(int i = 1 ; i <= r ; i ++ ){
for (int j = 1; j <= c ; j++ )
g[i][j] = sc.nextInt();
}
// 状态表示 :f[i][j] 表示 从 (1,1) 开始 选择东或者南方的花生的所有方案 属性 max
// 决策 : 选择 东 : f[i][j] += f[i - 1][j] + g[i][j];
// 选择 南 : f[i][j] += f[i][j - 1] + g[i][j];
// 都是 + g[i][j] , 决策 取 max 可以写为 f[i][j] = max(f[i - 1][j] , f[i][j - 1] ) + g[i][j];
int[]f = new int[c + 1];
for (int i = 1 ; i <= r ; i ++) {
for (int j = 1 ; j <= c ; j ++)
f[j] = Math.max(f[j] , f[j - 1]) + g[i][j];
}
System.out.println(f[c]);
}
}
}