AC代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int dp[2][610][610], num[610][610], N;
int max4( int a, int b, int c, int d ){
return max( max( a, b ), max( c, d ) );
}
int main(){
while( scanf( "%d", &N ) != EOF ){
for( int i = 1; i <= N; i++ ){
for( int j = 1; j <= N; j++ ){
scanf( "%d", &num[i][j] );
}
}
memset( dp, 0, sizeof( dp ) );
dp[0][1][1] = num[1][1];
int now = 1;
for( int k = 1; k <= N + N - 3; k++ ){
for( int i = 1; i <= N; i++ ){
for( int j = i + 1; j <= N; j++ ){
if( i != j ){
dp[now][i][j] = max4( dp[now^1][i][j], dp[now^1][i-1][j-1], dp[now^1][i][j-1], dp[now^1][i-1][j] ) + num[i][k-i+2] + num[j][k-j+2];
}
}
}
now ^= 1;
}
printf( "%d\n", dp[now^1][N-1][N] + num[N][N] );
}
return 0;
}