传送门
i 步数 j第1条路径上的横坐标 k第2条路径上的横坐标 (i,i-j) (i,i-k) 代表坐标,
存在四种可能
1.
两个路径点都向下移动 前一步状态为 j,k
2.
一个路径点向下移动一个向右移动
(1) 前一步状态为j-1 k
(2) 前一步状态为j,k-1
3.都向右移动 前一步状态为j-1,k-1
DP
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define input(x) scanf("%d",&x)
#define output(x) cout<<x;
#define cinline(n,arr) \ //懒得写函数
for(int i=1;i<=n;i++) \
input(arr[i]);
#define cinmap(n,m,arr) \
for(int i=1;i<=n;i++) \
cinline(m,arr+i)
const int maxn=100;
int dp[maxn][maxn][maxn];
int mp[maxn][maxn];
int main()
{
int n,y,x,z;
input(n);
//cout<<EOF<<endl;
while(input(x)!=EOF&&input(y)!=EOF&&input(z)!=EOF)
{
mp[x][y]=z;
}
for(int i=1;i<=2*n;i++)//j是第一个路径的纵坐标 k是第二个路径的纵坐标k是到了第几步 (i-j)(i-k)
{
for(int j=1;j<=n&&j<=i;j++)
{
for(int k=1;k<=n&&k<=i;k++)
{
int v1=mp[j][(i-j)];
int v2=mp[k][(i-k)];
//cout<<v1<<' '<<v1<<endl;
dp[i][j][k]=max(max(dp[i-1][j-1][k],dp[i-1][j][k-1]),max(dp[i-1][j][k],dp[i-1][j-1][k-1]))+v1+v2;
if(j==k)
dp[i][j][k]-=v1;
}
}
}
cout<<dp[2*n][n][n]<<endl;
}