NOIP2008传纸条,有点神奇的动态规划。
重合时赋值为0,则不会出现重合的情况。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int dp[110][52][52]={{{0}}};
int main()
{
int m,n;
while (scanf("%d%d",&m,&n)!=EOF)
{
memset(dp,0,sizeof(dp));
int x1,x2,k;
int A[500][500];
for (x1=1;x1<=m;x1++)
for (x2=1;x2<=n;x2++)
scanf("%d",&A[x1][x2]);
for (k=1;k<=m+n-2;k++)
for (x1=1;x1<=min(m,k+1);x1++)
for (x2=1;x2<=min(m,k+1);x2++)
{
if (x1!=x2)
dp[k][x1][x2]=max(max(dp[k-1][x1-1][x2],dp[k-1][x1][x2-1]),max(dp[k-1][x1][x2],dp[k-1][x1-1][x2-1]))+A[x1][k-x1+2]+A[x2][k-x2+2];
else
dp[k][x1][x2]=0;//max(max(dp[k-1][x1-1][x2],dp[k-1][x1][x2-1]),max(dp[k-1][x1][x2],dp[k-1][x1-1][x2-1]))+A[x1][k-x1+2];
}
/*for (k=1;k<=m+n-2;k++)
{
printf("k:");
for (x1=1;x1<=min(m,k+1);x1++)
for (x2=1;x2<=min(m,k+1);x2++)
printf("dp[%d][%d][%d]:%d ",k,x1,x2,dp[k][x1][x2]);
printf("\n");
}*/
printf("%d\n",dp[m+n-2][m-1][m]);
}
return 0;
}