蓝桥杯 传纸条 (动态规划)

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;
}

猜你喜欢

转载自blog.csdn.net/wwwlps/article/details/88732528