思路:
由于需要取2条路径最大值之和,且取完该位置数为0,因此两条路径相互影响,需要将两次路径看作两个人同时取数,使用四维dp数组,f[i][j][k][l]表示第一个人走到(i,j),第二个人走到(k,l)时最大取数之和 。
代码:
#include <bits/stdc++.h>
using namespace std;
//f[i][j][k][l]表示第一个人走到(i,j),第二个人走到(k,l)时最大取数之和
int main()
{
int n,i,j,k,l,x,y,m;
int a[10][10]={0},f[10][10][10][10]={0}; //初始化置0
cin>>n;
while(scanf("%d%d%d",&x,&y,&m))
{
if(x==0&&y==0&&m==0) //输入3个0则停止输入
break;
a[x][y]=m; //标记方格数字
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
for(k=1;k<=n;k++)
{
l=i+j-k; //两人同时走
if(l>=1)
{
//四种情况:都向右走,一个向下一个向右,一个向右一个向下,都向下走,选择取数最大情况
f[i][j][k][l]=max(f[i-1][j][k-1][l],max(f[i][j-1][k-1][l],max(f[i-1][j][k][l-1],f[i][j-1][k][l-1])));
if(i==k&&j==l) //方格处数已第一个人被取过,则第二个人经过该处时数置0
f[i][j][k][l]+=a[i][j];
else
f[i][j][k][l]+=a[i][j]+a[k][l];
}
}
cout<<f[n][n][n][n]; //遍历结束后取得最大数
return 0;
}