• [NOIp2008] 传纸条


    Description

    小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。一次素质拓展活动中,班上同学安排做成一个(m)(n)列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了。幸运的是,他们可以通过传纸条来进行交流。纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标((1,1)),小轩坐在矩阵的右下角,坐标((m,n))。从小渊传到小轩的纸条只可以向下或者向右传递,从小轩传给小渊的纸条只可以向上或者向左传递。

    在活动进行中,小渊希望给小轩传递一张纸条,同时希望小轩给他回复。班里每个同学都可以帮他们传递,但只会帮他们一次,也就是说如果此人在小渊递给小轩纸条的时候帮忙,那么在小轩递给小渊的时候就不会再帮忙。反之亦然。

    还有一件事情需要注意,全班每个同学愿意帮忙的好感度有高有低(注意:小渊和小轩的好心程度没有定义,输入时用(0)表示),可以用一个([0,100])内的自然数来表示,数越大表示越好心。小渊和小轩希望尽可能找好心程度高的同学来帮忙传纸条,即找到来回两条传递路径,使得这两条路径上同学的好心程度之和最大。现在,请你帮助小渊和小轩找到这样的两条路径。

    Input

    第一行有两个用空格隔开的整数(m)(n),表示班里有(m)(n)列。

    接下来的(m)行是一个(m imes n)的矩阵,矩阵中第(i)(j)列的整数表示坐在第(i)(j)列的学生的好心程度。每行的(n)个整数之间用空格隔开。

    Output

    输出文件共一行一个整数,表示来回两条路上参与传递纸条的学生的好心程度之和的最大值。

    Sample Input

    3 3
    0 3 9
    2 8 5
    5 7 0
    

    Sample Output

    34
    

    Hint

    对于(30\%)的数据,(1 le m,n le 10)

    对于(100\%)的数据满足:(1 le m,n le 50)

    题解

    四维(DP)

    设状态为(dp[i][j][x][y]),想象成两个人同时从((1,1))传到((m,n))

    得出状态转移方程:(dp[i][j][x][y]=MAX(dp[i-1][j][x-1][y],dp[i-1][j][x][y-1],dp[i][j-1][x-1][y],dp[i][j-1][x][y-1])+num[i][j]+num[x][y])

    #include <iostream>
    #include <cstdio>
    using namespace std;
    
    const int MorN=51;
    int num[MorN][MorN],dp[MorN][MorN][MorN][MorN];
    
    int MAX(int a,int b,int c,int d)
    {
        int Max1=(a>b)?a:b,Max2=(c>d)?c:d;
        return (Max1>Max2)?Max1:Max2;
    }
    
    int main()
    {
        register int m,n,i,j,x,y;
        scanf("%d%d",&m,&n);
        for (i=1;i<=m;i++)
            for (j=1;j<=n;j++) scanf("%d",&num[i][j]);
        for (i=1;i<=m;i++)
            for (j=1;j<=n;j++)
                for (x=1;x<=m;x++)
                    for (y=1;y<=n;y++)
                        if (i!=x||j!=y) dp[i][j][x][y]=MAX(dp[i-1][j][x-1][y],dp[i-1][j][x][y-1],dp[i][j-1][x-1][y],dp[i][j-1][x][y-1])+num[i][j]+num[x][y];
        dp[m][n][m][n]=max(dp[m-1][n][m][n-1],dp[m][n-1][m-1][n]);
        printf("%d
    ",dp[m][n][m][n]);
        return 0;
    }
    

    本文作者:OItby @ https://www.cnblogs.com/hihocoder/

    未经允许,请勿转载。

  • 相关阅读:
    VintaSoft Barcode.NET SDK专业的条形码读写控件详细介绍
    数据库查询构建控件集Active Query Builder
    linux系统下集成开发工具选择
    linux常用命令
    ubuntu 10.10绚丽桌面效果及常用快捷键
    Restful服务1
    EasyJF简易的j2EE框架
    erlang学习1
    netbeans下 xdebug调试php
    介绍几个开源的网站
  • 原文地址:https://www.cnblogs.com/hihocoder/p/10421606.html
Copyright © 2020-2023  润新知