设有 N×N 的方格图 (N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 0。
某人从图的左上角的 A 点出发,可以向下行走,也可以向右走,直到到达右下角的 B 点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字 00)。
此人从 A 点到 B 点共走两次,试找出 22 条这样的路径,使得取得的数之和为最大。
只需输出一个整数,表示 22 条路径上取得的最大的和。
#include<cstdio>
#include<algorithm>
using namespace std;
struct point
{
int x,y,data;
}p[100];
int n,m,map[11][11],f[11][11][11][11];
int main()
{
int i,j,k,l;
scanf("%d",&n);
while(1)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(!a&&!b&&!c)
break;
p[++m].x=a;
p[m].y=b;
p[m].data=c;
}
for(i=1;i<=m;i++)
map[p[i].x][p[i].y]=p[i].data;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
for(k=1;k<=n;k++)
{
l=i+j-k;
if(l<=0)
break;
f[i][j][k][l]=max(f[i-1][j][k-1][l],max(f[i-1][j][k][l-1],max(f[i][j-1][k-1][l],f[i][j-1][k][l-1])));
if(i==k&&j==l)
f[i][j][k][l]+=map[i][j];
else
f[i][j][k][l]+=map[i][j]+map[k][l];
}
printf("%d\n",f[n][n][n][n]);
return 0;