NC16759 方格取数
状态表示:\(f(i,j,k,l)\)表示第一个人走到\((i,j)\),第二个人走到\((k,l)\)的价值最大值
特判一下坐标相等情况就好了。
const int N=15;
int f[N][N][N][N];
int g[N][N];
int n;
int main()
{
cin>>n;
int a,b,c;
while(cin>>a>>b>>c)
{
if(!a && !b && !c) break;
g[a][b]=c;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
for(int l=1;l<=n;l++)
{
int w;
if(i == k && j == l) w=g[i][j];
else w=g[i][j]+g[k][l];
f[i][j][k][l]=max(f[i][j][k][l],f[i-1][j][k-1][l]+w);
f[i][j][k][l]=max(f[i][j][k][l],f[i][j-1][k-1][l]+w);
f[i][j][k][l]=max(f[i][j][k][l],f[i-1][j][k][l-1]+w);
f[i][j][k][l]=max(f[i][j][k][l],f[i][j-1][k][l-1]+w);
}
cout<<f[n][n][n][n]<<endl;
//system("pause");
}