思路
- 状态表示:
dp[i][j]
表示从(1, 1)
走到(i, j)
的所有路线中权值最大的那条路线 - 状态计算(集合划分):从
(1, 1)
走到(i, j)
的所有路线集合划分为下面两类- 最后一步走到
(i, j)
时,是从上往下走的 - 最后一步走到
(i, j)
时,是从左往右走的
- 最后一步走到
- 状态转移方程:
dp[i][j] = max(dp[i - 1][j] + w[i][j], dp[i][j - 1] + w[i][j])
ans = dp[r][c]
import java.util.*;
import java.io.*;
class Main {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String[] sp;
// 花生田矩阵
int[][] a = new int[110][110];
// 花生田个数、花生田的行列、花生数目
int t, r, c, m;
int[][] dp = new int[110][110];
void run() throws Exception {
sp = reader.readLine().split(" ");
t = Integer.valueOf(sp[0]);
while (t-- > 0) {
sp = reader.readLine().split(" ");
r = Integer.valueOf(sp[0]);
c = Integer.valueOf(sp[1]);
for (int i = 1; i <= r; i++) {
sp = reader.readLine().split(" ");
for (int j = 1; j <= c; j++) {
a[i][j] = Integer.valueOf(sp[j - 1]);
}
}
// dp[i][j] 表示从(1, 1) 到 (i, j) 的所有路线中的最大取值
for (int i = 1; i <= r; i++) {
for (int j = 1; j <= c; j++) {
dp[i][j] = Math.max(dp[i][j - 1] + a[i][j], dp[i - 1][j] + a[i][j]);
}
}
System.out.println(dp[r][c]);
}
}
public static void main(String[] args) throws Exception {
new Main().run();
}
}