题意理解
用 dp[i][j][i1][j1] 表示来的时候从 [i][j] 走,回去的时候从 [i1][j1] 走的最大和,那么只要来回不是从同一个格子走,那么就没有问题。最后结果应该是 max(dp[M−1][N][M][N−1],dp[M][N−1][M−1][N]) ,但是显然这两者是一样的。
代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static final int maxn = 60;
static int M, N;
static int[][] a = new int[maxn][maxn];
static int[][][][] dp = new int[maxn][maxn][maxn][maxn];
public static void main(String[] args) {
FastScanner fs = new FastScanner();
M = fs.nextInt();
N = fs.nextInt();
for(int i = 1; i <= M; i++) {
for(int j = 1; j <= N; j++) {
a[i][j] = fs.nextInt();
}
}
for(int i = 1; i <= M; i++) {
for(int j = 1; j <= N; j++) {
for(int i1 = 1; i1 <= M; i1++) {
for(int j1 = 1; j1 <= N; j1++) {
if(i == i1 && j == j1 && i != M && j != N) {
continue;
}
dp[i][j][i1][j1] = mmax(
dp[i-1][j][i1-1][j1],
dp[i-1][j][i1][j1-1],
dp[i][j-1][i1-1][j1],
dp[i][j-1][i1][j1-1]) + a[i][j] + a[i1][j1];
}
}
}
}
System.out.println(dp[M-1][N][M][N-1]);
}
public static int mmax(int a, int b, int c, int d) {
int t1 = Math.max(a, b);
int t2 = Math.max(t1, c);
int t3 = Math.max(t2, d);
return t3;
}
public static class FastScanner {
private BufferedReader br;
private StringTokenizer st;
public FastScanner() {
br = new BufferedReader(new InputStreamReader(System.in));
}
public String nextToken() {
while(st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return st.nextToken();
}
public int nextInt() {
return Integer.valueOf(nextToken());
}
}
}