本蒟蒻一开始把判断不重写成了w!=y&&x!=z,后来改成了w!=y||x!=z,但两次都AC了
1.错误
#include <iostream>
#include <cstring>
using namespace std;
int n,m,a[55][55],f[55][55][55][55],dx[2]={0,1},dy[2]={1,0};
bool check(int x,int y)
{
return x>=1&&x<=n&&y>=1&&y<=m;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
memset(f,0xc0,sizeof(f));
f[1][1][1][1]=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=1;k<=n;k++)
for(int l=1;l<=m;l++)
for(int b=0;b<=1;b++)
for(int c=0;c<=1;c++)
{
int w=i+dx[b];
int x=j+dy[b];
int y=k+dx[c];
int z=l+dy[c];
if(check(w,x)&&check(y,z)&&w!=y&&x!=z||w==n&&x==m&&y==n&&z==m)
{
f[w][x][y][z]=max(f[w][x][y][z],f[i][j][k][l]+a[w][x]+a[y][z]);
}
}
cout<<f[n][m][n][m];
return 0;
}
2.正确
#include <iostream>
#include <cstring>
using namespace std;
int n,m,a[55][55],f[55][55][55][55],dx[2]={0,1},dy[2]={1,0};
bool check(int x,int y)
{
return x>=1&&x<=n&&y>=1&&y<=m;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
memset(f,0xc0,sizeof(f));
f[1][1][1][1]=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=1;k<=n;k++)
for(int l=1;l<=m;l++)
for(int b=0;b<=1;b++)
for(int c=0;c<=1;c++)
{
int w=i+dx[b];
int x=j+dy[b];
int y=k+dx[c];
int z=l+dy[c];
if(check(w,x)&&check(y,z)&&(w!=y||x!=z)||w==n&&x==m&&y==n&&z==m)
{
f[w][x][y][z]=max(f[w][x][y][z],f[i][j][k][l]+a[w][x]+a[y][z]);
}
}
cout<<f[n][m][n][m];
return 0;
}