P1006 传纸条

题目给了一个矩阵,要求一来一回点权和最大,而且走过的点不能再走

最开始我是这么想的:

顺着来一遍,记录路径,清空路径上的好感度,再反着来一遍。

结果出错了,为什么?

因为这样做能保证第一条路一定点权和最大,但不能确保一来一回的点权和最大(样例都过不掉)

所以我们把求两条严格不相交路径看成两个人同时从起点出发,永不相见,最后又都到达终点。这样就考虑了所有的情况。

很容易想到x+y=steps,用步数作为阶段,走完n+m-2步就到达了终点

所以最终输出的结果是f【n+m-2】【n-1】【n-2】(两个人走的步数是不相等的,而终点的权值为0,所以这就是答案了)

代码如下(注意行与列不要搞混)

#include<iostream>
#include<cstring>
using namespace std;
const int N=51;
int de[N][N],check[N][N],f[N*2][N][N];
int n,m,ans;
int main()
{
freopen("in.txt","r",stdin);
cin>>m>>n;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
cin>>de[i][j];
for(int i=1;i<=m+n-2;i++)
for(int x1=0;x1<=m-1;x1++) //纵向最多走n-1步
for(int x2=0;x2<=m-1;x2++)
if(x1==x2||i<x1||i<x2) continue;
else {
int a,b,c,d;
a=b=c=d=0;
if(x1) a=f[i-1][x1-1][x2];
if(x2) b=f[i-1][x1][x2-1];
if(x1&&x2) c=f[i-1][x1-1][x2-1];
d=f[i-1][x1][x2];
f[i][x1][x2]=max(max(a,b),max(c,d))+de[1+x1][1+i-x1]+de[1+x2][1+i-x2];
}
cout<<f[n+m-2][m-2][m-1];
return 0;
}

原文地址:https://www.cnblogs.com/Neptune0/p/11815394.html