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

  • 相关阅读:
    JavaScript日期处理类库momentjs
    sublime text 2 学习
    node.js代理设置
    使用nodejs将html5 canvas base64编码图片保存为文件
    Sublime Text 2 常用插件介绍
    把silverlight treeview 节点前面的小三角换成自定义的图片
    文件监控
    linux内核中的红黑树代码解析
    static关键字
    红黑树的实现(二)
  • 原文地址:https://www.cnblogs.com/Neptune0/p/11815394.html
Copyright © 2011-2022 走看看