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

    题目给了一个矩阵,要求一来一回点权和最大,而且走过的点不能再走

    最开始我是这么想的:

    顺着来一遍,记录路径,清空路径上的好感度,再反着来一遍。

    结果出错了,为什么?

    因为这样做能保证第一条路一定点权和最大,但不能确保一来一回的点权和最大(样例都过不掉)

    所以我们把求两条严格不相交路径看成两个人同时从起点出发,永不相见,最后又都到达终点。这样就考虑了所有的情况。

    很容易想到x+y=steps,用步数作为阶段,走完n+m-2步就到达了终点

    所以最终输出的结果是f【n+m-2】【n-1】【n-2】(两个人走的步数是不相等的,而终点的权值为0,所以这就是答案了)

    代码如下(注意行与列不要搞混)

    #include<iostream>
    #include<cstring>
    using namespace std;
    const int N=51;
    int de[N][N],check[N][N],f[N*2][N][N];
    int n,m,ans;
    int main()
    {
    freopen("in.txt","r",stdin);
    cin>>m>>n;
    for(int i=1;i<=m;i++)
    for(int j=1;j<=n;j++)
    cin>>de[i][j];
    for(int i=1;i<=m+n-2;i++)
    for(int x1=0;x1<=m-1;x1++) //纵向最多走n-1步
    for(int x2=0;x2<=m-1;x2++)
    if(x1==x2||i<x1||i<x2) continue;
    else {
    int a,b,c,d;
    a=b=c=d=0;
    if(x1) a=f[i-1][x1-1][x2];
    if(x2) b=f[i-1][x1][x2-1];
    if(x1&&x2) c=f[i-1][x1-1][x2-1];
    d=f[i-1][x1][x2];
    f[i][x1][x2]=max(max(a,b),max(c,d))+de[1+x1][1+i-x1]+de[1+x2][1+i-x2];
    }
    cout<<f[n+m-2][m-2][m-1];
    return 0;
    }

  • 相关阅读:
    Building a flexiable renderer
    Indirect Illumination in mental ray
    我的心情
    Cellular Automata
    Subsurface Scattering in mental ray
    Shader Types in mental ray
    BSP Traversal
    我的渲染器终于达到了MR的速度
    How to handle displacement and motion blur
    说明
  • 原文地址:https://www.cnblogs.com/Neptune0/p/11815394.html
Copyright © 2011-2022 走看看