题目描述
设有N×N的方格图,我们在其中的某些方格中填入正整数,而其它的方格中则放入数字0。如下图所示:
某人从图中的左上角的A出发,可以向下行走,也可以向右行走,直到达右下角的B点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。此人从A点到B点共走了两次,试找出两条这样的路径,使得取得的数字和为最大。
输入
第一行为一个整数N(N≤10),表示N×N的方格图。
接下来的每行有三个整数,第一个为行号数,第二个为列号数,第三个为在该行、该列上所放的数。一行0 0 0表示结束。
输出
包含一个整数,表示两条路径上取得的最大的和。
样例输入 复制
8 2 3 13 2 6 6 3 5 7 4 4 14 5 2 21 5 6 4 6 3 15 7 2 14 0 0 0
样例输出 复制
67
参考答案:
#include<iostream>
using namespace std;
int n;
int map[1001][1001];
int f[200][200][200];
int main()
{
cin>>n;
int x,y,z;
while(cin>>x>>y>>z)
{
if(!x&&!y&&!z)
break;
map[x][y]=z;
}
for (int k=2;k<=2*n;k++)
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
{
int a=k-i,b=k-j;
if (a>=1&&a<=n&&b>=1&&b<=n)
{
int t=max(max(f[k-1][i-1][j],f[k-1][i][j]),max(f[k-1][i][j-1],f[k-1][i-1][j-1]));
if(i==j)
f[k][i][j]=t+map[i][a];
else
f[k][i][j]=t+map[i][a]+map[j][b];
}
}
cout<<f[2*n][n][n];
}