http://www.dotcpp.com/oj/problem1611.html
题目大意:给一矩阵,两人分别在左上和右下,两人传递纸条,规定左上的人只能向右和向下传递,右下的人只能向左和向上传递,两者路径不能相交,求两条路径的权值总和最大是多少。
题目解答:
我们转化一下思想,题目中说由左上方到右下方来回,我们可以看作是从左上方找两条不相交的路径到右下方。这里我们可以好比是两个纸条同时从左上方向右下方传,只要保证在同一时刻两个纸条不在同一个人手里,那么我们就能保证两个字条的路径不相交.
确定算法: DP(动态规划)
状态:当前时刻的两个字条的坐标。
为了保证两个字条是同步传递的,所以方程式要加一个限定条件 ( i + j = u + v )
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=51;
int dp[maxn][maxn][maxn][maxn];
int n,m,a[maxn][maxn];
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
int A,B,C,D;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
for(int u=1;u<=n;u++)
{
int v=i+j-u;
if(i>u&&v>=1)
{
A=dp[i-1][j][u-1][v];
//if(j-1>=0)
B=dp[i][j-1][u-1][v];
//if(u-1>=0)
C=dp[i-1][j][u][v-1];
//if(v-1>=0)
D=dp[i][j-1][u][v-1];
dp[i][j][u][v]=max(max(C,D),max(A,B))+a[i][j]+a[u][v];
}
}
}
}
cout << dp[n][m-1][n-1][m] << endl;
return 0;
}