深搜,把两张纸条都看做从左上角开始,每次都有四种情况如果两个纸条下一步走的点重合,就不走,另外三种情况能遍历到所有情况 代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
int n1,m1;
int M;
int f[51][51][51][51],s[51][51];
int dfs(int x1,int y1,int x2,int y2)
{
if(f[x1][y1][x2][y2]!=-1) return f[x1][y1][x2][y2];
if (x1==n1&&y1==m1&&x2==n1&&y2==m1) return 0;
int M=0;
//都向下走
if(x1<n1&&x2<m1&&(x1+1!=x2+1||y1!=y2) )
{
M=max(M,dfs(x1+1,y1,x2+1,y2)+s[x1+1][y1]+s[x2+1][y2]);
}
//A向下走,B向右走
if(x1<n1&&y2<m1&&(x1+1!=x2||y1!=y2+1))
{
M=max(M,dfs(x1+1,y1,x2,y2+1)+s[x1+1][y1]+s[x2][y2+1]);
}
//A向右走,b向下走
if(y1<n1&&x2<m1&&(x1!=x2+1||y1+1!=y2)) M=max(M,dfs(x1,y1+1,x2+1,y2)+s[x1][y1+1]+s[x2+1][y2]);
//A向右走,b向右走
if(y1<n1&&y2<m1&&(x1!=x2||y1+1!=y2+1)) M=max(M,dfs(x1,y1+1,x2,y2+1)+s[x1][y1+1]+s[x2][y2+1]);
f[x1][y1][x2][y2]=M;
//cout<<f[x1][y1][x2][y2]<<endl;
return M;
}
int main()
{
cin>>n1>>m1;
for(int i=0;i<=n1;i++)
{
for(int j=0;j<=m1;j++)
{
for(int k=0;k<=n1;k++)
{
for(int m=0;m<=m1;m++)
{
f[i][j][k][m]=-1;
}
}
}
}
int a;
for(int i=1;i<=n1;i++)
for(int j=1;j<=m1;j++)
{
cin>>a;
s[i][j]=a;
}
cout<<dfs(1,1,1,1)+s[1][1];
return 0;
}