zoukankan      html  css  js  c++  java
  • P1006 传纸条(dp)

    题意是两条路径一条左上角到右下角、一条从右下角到左上角,找权值最大的两条路径。每个点只能走一次。

    问题转化为和P1004方格取数一样的情形,即两条不同的路径从左上角到右下角,并去掉重复加的点即可。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=55;
    int dp[maxn][maxn][maxn][maxn];
    int a[maxn][maxn];
    int m,n,v1,v2,v3;
    int main()
    {
        cin>>m>>n;
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                cin>>v1;
                a[i][j]=v1;
            }
        }
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                for(int k=1;k<=m;k++){
                    for(int l=1;l<=n;l++){
                        dp[i][j][k][l]=max(dp[i-1][j][k-1][l],max(dp[i-1][j][k][l-1],max(dp[i][j-1][k-1][l],dp[i][j-1][k][l-1])))+a[i][j]+a[k][l];
                        if(i==k&&j==l)dp[i][j][k][l]-=a[i][j];//如果同一个点加了两次必须减掉一个
                    }
                }
            }
        }
        cout<<dp[m][n][m][n]<<endl;
        return 0;
    }
    View Code
  • 相关阅读:
    软件git装的过程
    深入理解多态
    深入.net框架
    深入C#数据类型
    JavaScript 性能优化(2)
    JAVA: 集合框架
    JavaScript 性能优化(1)
    JavaScript 常用进度条
    Java: 随机生成字符串并排序
    JAVA: String详解
  • 原文地址:https://www.cnblogs.com/mohari/p/12936860.html
Copyright © 2011-2022 走看看