wiki 1043 方格取数

此题第一眼就以为能用两次动态规划来完成,即一个人先走一次,然后把它经过的点的值都变成0,然后让他再走一遍,两次结果加起来就是最终结果。但是这个就是本题最大的陷阱。具体的解释请看这里

我的AC代码:

#include
using namespace std;
int a[20][20],f[20][20][20][20];
int main()
{
int n,x,y,z;
cin>>n;
while(cin>>x>>y>>z)
{
if(x==0) break;
a[x][y]=z; 
}
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++)
{
f[i][j][k][l]=max(max(f[i-1][j][k-1][l],f[i-1][j][k][l-1]),max(f[i][j-1][k-1][l],f[i][j-1][k][l-1]))+a[i][j]+a[k][l];
if(i==k&&j==l) f[i][j][k][l]=f[i][j][k][l]-a[i][j];
}
cout<


你可能感兴趣的:(ACM,算法,动态规划)