我们考虑两个人同时走,就相当于数字三角形。状态转移方程为:
f[i][j][k][l]=max(f[i-1][j][k-1][l],f[i-1][j][k][l-1],f[i][j-1][k-1][l],f[i][j-1][k][l-1])+a[i][j]+a[k][l];f[i][j][k][l]=max(f[i−1][j][k−1][l],f[i−1][j][k][l−1],f[i][j−1][k−1][l],f[i][j−1][k][l−1])+a[i][j]+a[k][l];
不过要判断i=k&&j=l的情况。
#include<iostream>
using namespace std;
int dp[11][11][11][11];
int map[11][11];
int n;
int max(int a, int b)
{
return a > b ? a : b;
}
int main()
{
int x, y, temp;
cin >> n;
while (1)
{
cin >> x >> y >> temp;
if (x == 0 && y == 0 && temp == 0)
break;
map[x][y] = temp;
}
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)
{
dp[i][j][k][l] = max(max(dp[i - 1][j][k - 1][l], dp[i - 1][j][k][l - 1]), max(dp[i][j - 1][k - 1][l], dp[i][j - 1][k][l - 1])) + map[i][j] + map[k][l];
if (i == k && j == l) dp[i][j][k][l] -= map[i][j];
}
cout << dp[n][n][n][n];
return 0;
}