zoukankan      html  css  js  c++  java
  • noip2008-t3

    【题目描述】

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

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

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

    【解】

      乍一看和基本的坐标模型差不多,不过区别在于要找两条路径,所以就采用了双线程这种神奇的东西。首先,传统的坐标模型中,找这样一条路径f[i][j]=max(f[i-1][j],f[i][j-1])+a[i][j],那么这里也同理,我们设走到了(i,j)(l,m)这两个点,那么f[i][j][l][m]=max(f[i-1][j][l][m],f[i][j-1][l][m],f[i][j][l-1][m],f[i][j][l][m-1])+a[i][j]+a[l][m]。这样是个四维的dp。但是这里有两个问题,一是两条路径不能相交,二是100%的数据n,m大小到了50,四维显然是过不了的。对于第二个,我们发现,从(1,1)到(n,m)一共要走m+n-2步,我们枚举走的步数和走到的行数就可以用k+2-i(j)算出走到得列数,这样状态就被压缩到了三维,转移方程就变成了f[k][i][j]=max(max(f[k-1][i-1][j],f[k-1][i][j-1]),max(f[k-1][i][j],f[k-1][i-1][j-1]))+a[i][k+2-i]+a[j][k+2-j];。而第一个问题我们加一个if((i==n && j==n && k==m+n-2) || (i!=j && k+2-i>=1 && k+2-j>=1))就能保证两条路线不会相交了。因为,首先两条路线一定是一条路线一边,只要i==j他们就会走到同一行同一列也就存在了交集,只要i!=j两条路线就不会。当然他们是可以同时走到(n,m)的。而且这样猛然看上去好像不对,因为两条路线总得在每一行都经过吧,但他们实际上就是一个先搜到第n行一个后搜到第n行罢了,即一前一后的进行求解。

    玲珑骰子安红豆,入骨相思知不知。
  • 相关阅读:
    VTK二维图像的三维显示
    VtkTransform 和 SetPosition的区别
    Qt QList 遍历元素
    Qt QList详解
    QT QList介绍及应用
    Qt 生成随机区间浮点数 generateRand
    Qt qsrand qrand 产生随机数的两只方法
    Qt QStringLiteral
    Qt QMap简单用法
    Qt 遍历QMap
  • 原文地址:https://www.cnblogs.com/hyl2000/p/5893959.html
Copyright © 2011-2022 走看看