思路:多线程DP,同时计算两条路径的最大值,记得当走到同一个点时要删除一个数 时间复杂度O(n^4)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int dp[10][10][10][10];
int a[10][10];
int main ()
{
int n;
cin>>n;
int k,f,ww;
for (int i=1;i<=n;i++)
{
cin>>k>>f>>ww;
a[k][f]=ww;//存图和权值
}
for (int o=1;o<=n;o++)
for (int p=1;p<=n;p++)
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
{
dp[o][p][i][j]=max(dp[o-1][p][i-1][j],dp[o][p-1][i-1][j]);
dp[o][p][i][j]=max(dp[o][p][i][j],dp[o][p-1][i][j-1]);
dp[o][p][i][j]=max(dp[o][p][i][j],dp[o-1][p][i][j-1]);
dp[o][p][i][j]+=a[o][p]+a[i][j];
if (o==i&&p==j)//一定要记住走过之后数会被取走
dp[o][p][i][j]-=a[o][p];
}
cout<<dp[n][n][n][n];//点对点
return 0;
}