思路:
f[k][i1][i2] 表示 从(1,1)走到(i1,j1)和(i2,j2)各走k步的集合最大值
第一遍错误思路:先刷一遍最大值,然后将最大值的路径覆盖为0,然后再刷第二遍最大值。
错误原因: 先刷第一遍,这样第二遍的值是受第一遍刷的路径所影响的,有后效性,不能作为整体最优解。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 20;
int a[N][N];
int f[N*2][N][N];
int main()
{
int n; cin>>n;
int aa,b,c;
while(cin>>aa>>b>>c,aa||b||c) a[aa][b] = c;
for(int k=2;k<=n*2;k++){
for(int i1=1;i1<=n;i1++)
for(int i2=1;i2<=n;i2++)
{
int j1 = k-i1;
int j2 = k-i2;
if(j1>=1 && j1<=n && j2>=1 && j2<=n){
int &x = f[k][i1][i2];
x = max(x,f[k-1][i1][i2]);
x = max(x,f[k-1][i1-1][i2]);
x = max(x,f[k-1][i1][i2-1]);
x = max(x,f[k-1][i1-1][i2-1]);
int t = a[i1][j1];
if(i1!=i2) t += a[i2][j2];
x += t;
}
}
}
cout<<f[n*2][n][n]<<endl;
return 0;
}