题目大意:从(0,0)出发走到(N,N),重复走两次,求能获得的最大值(经过一次则清零)
思路:双重dp,两次局部最优不等于全局最优,复杂度O(N^3)
#include<iostream>
#include<string.h>
using namespace std;
int dp[11][11][11][11],a[11][11];
int N;
int main()
{
cin>>N;
int x,y,v,i,j,t1,t2;
memset(a,0,sizeof(a));
while(cin>>x>>y>>v)
{
if (x==0&& y==0 && v==0)
break;
a[x][y]=v;
}
memset(dp,0,sizeof(dp));
for (i=1;i<=N;i++)
for (j=1;j<=N;j++)
for (x=1;x<=N;x++)
for (y=1;y<=N;y++)
{
t1=max(dp[i-1][j][x-1][y],dp[i][j-1][x-1][y]);
t2=max(dp[i-1][j][x][y-1],dp[i][j-1][x][y-1]);
if (i==x && j==y)
dp[i][j][x][y]=a[i][j]+max(t1,t2);
else
dp[i][j][x][y]=a[i][j]+a[x][y]+max(t1,t2);
}
cout<<dp[N][N][N][N]<<endl;
return 0;
}