const int MAXN = 110; int dp[2][MAXN][MAXN], ipt[MAXN][MAXN]; int n; inline bool check(int x) { return x >= 0 && x < n; } inline void Max(int step, int now, int x, int xx, int tx, int txx) { int ty = step + 1 - tx, tyy = step + 1 - txx; if (!check(tx) || !check(ty) || !check(txx) || !check(tyy)) return; if (step != n + n - 3 && tx == txx && ty == tyy) return; int val = dp[now][x][xx] + ipt[tx][ty] + ipt[txx][tyy]; if (dp[now ^ 1][tx][txx] < val) dp[now ^ 1][tx][txx] = val; } int main() { while (~RI(n)) { REP(i, n) REP(j, n) RI(ipt[i][j]); if (n == 1) { WI(ipt[0][0]); continue; } int step = n + n - 2, now = 0; CLR(dp, -1); dp[now][0][0] = ipt[0][0]; REP(s, step) { REP(i, n) REP(j, n) { int x = i, y = s - i, xx = j, yy = s - j; if (!check(x) || !check(y) || !check(xx) | !check(yy) || !~dp[now][x][xx]) continue; Max(s, now, i, j, i, j); Max(s, now, i, j, i + 1, j); Max(s, now, i, j, i, j + 1); Max(s, now, i, j, i + 1, j + 1); } CLR(dp[now], -1); now ^= 1; } cout << dp[now][n - 1][n - 1] - ipt[n - 1][n - 1] << endl; } return 0; }
原文:http://blog.csdn.net/wty__/article/details/38401979