http://acm.hdu.edu.cn/showproblem.php?pid=2686 #include<iostream> #define N 35 using namespace std; int map[N][N]; int ans[2*N][N]; int dp[2*N][N][N]; int Max(int a,int b,int c,int d) { if(a<b) a=b; if(a<c) a=c; if(a<d) a=d; return a; } int main(void) { int n; while(~scanf("%d",&n)) { int i,j,k; for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&map[i][j]); for(j=0;j<n;j++) for(i=j;i<j+n;i++) ans[i][j]=map[i-j][j]; memset(dp,0,sizeof(dp)); int m=2*n-1; for(i=1;i<m;i++) { int s,t; if(i<n) { s=0; t=i+1; } else { s=i-n+1; t=n; } for(j=s;j<t;j++) for(k=j+1;k<t;k++) dp[i][j][k]=Max(dp[i-1][j-1][k-1],dp[i-1][j][k-1],dp[i-1][j-1][k],dp[i-1][j][k])+ans[i][j]+ans[i][k]; } printf("%d/n",dp[m-2][n-2][n-1]+map[0][0]+map[n-1][n-1]); } }