分析
由题意可知,这个人要从A点到B点共走两次,所以我们可以同时进行两条路径。
再由摘花生的题可以,两个路径走到同一点的条件为路径宗族一定,并且只能向下和向右行走。不能走其他的路径。因此。我们假设一个中间量k。k=i1+j1=i2+j2.当i1==i2时,路径走到同一点。
#include<iostream>
#include<algorithm>
using namespace std;
const int N =15;
int n;
int w[N][N];
int f[2*N][N][N];
int main()
{
cin>>n;
int a,b,c;
while(cin>>a>>b>>c,a||b||c) w[a][b]=c;
//k为横+纵=2*n
for(int k=2;k<=n+n;k++)
for(int i1=1;i1<=n;i1++)
for(int i2=1;i2<=n;i2++)
{
int j1=k-i1,j2=k-i2;
if (j1 >= 1 && j1 <= n && j2 >= 1 && j2 <= n)//防止出界
{
int t = w[i1][j1];//这个点的数字
if (i1 != i2) t += w[i2][j2]; //两次走的路径重合,只加一次
int &x = f[k][i1][i2];
//四个路径
x = max(x, f[k - 1][i1 - 1][i2 - 1] + t);
x = max(x, f[k - 1][i1 - 1][i2] + t);
x = max(x, f[k - 1][i1][i2 - 1] + t);
x = max(x, f[k - 1][i1][i2] + t);
}
}
cout<<f[n+n][n][n];
return 0;
}