双线程dp,前两个维数是第一个人的坐标,后两个维数是第二个人的坐标。
#include <iostream>
#include <algorithm>
#define f(_x) for(int _x=1;_x<=n;_x++)
using namespace std;
int dp[10][10][10][10],num[10][10],x,y,number,n;
int main(){
cin>>n;
while(cin>>x>>y>>number&&x+y+number)num[x][y]=number;
f(i){f(j){f(k){f(l){
dp[i][j][k][l]=max(max(dp[i-1][j][k-1][l],dp[i][j-1][k][l-1]),max(dp[i-1][j][k][l-1],dp[i][j-1][k-1][l]))+num[i][j];
if(i-k||j-l)dp[i][j][k][l]+=num[k][l];
}}}}
cout<<dp[n][n][n][n];
}