• zzuli 1875多线DP


    1875: 蛤玮的财宝

    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 530  Solved: 116

    SubmitStatusWeb Board

    Description

    蛤玮和他的妹子出海游玩,不小心遭遇了海难,他们醒来之后发现自己到了一座金银岛.岛主非常好心的告诉他们在岛的另一边有船可以送他们回家.
    这座岛可以看成n*m的矩阵,蛤玮他们在位置(1,1),而船在位置(n,m).蛤玮发现金银岛遍地都是金子,每个格子里有价值a[i,j]的金子,他和妹子打算在回去的路上带一些走.如果他们路过了位置(i,j),就可以假装系鞋带捡走地上的金子.为了不引起怀疑,他们在走的时候只能往接近码头的方向走,即如果蛤玮现在在(i,j),他只能移动到(i+1,j)或者(i,j+1).为了能拿走更多的金子,蛤玮和妹子决定装作互相不认识,这样他们就可以分开走,从而拿到更多的金子.
    蛤玮和他妹子想知道他们最多能拿走多少金子.
    注意如果蛤玮和他妹子经过了相同的地方,只能得到一次金子,因为地上的捡完就没有了.

    Input

     
    T(1<=T<=10),表示数据组数.
    每组数据第一行n,m(1<=n,m<=100),接下来n行,每行m个数,第i行第j列的值a[i,j](1<=a[i,j]<=1000)表示位置(i,j)的金子的价值.

    Output

     
    每组数据输出一行,蛤玮和他妹子能拿到的金子总价的最大值.

    Sample Input

    1 2 2 2 1 1 2

    Sample Output

    6
    同上一道双线DP类似思路,不过注意最后加上两个起点和终点的值即可。

    #include<bits/stdc++.h>
    using namespace std;
    #define CIN(a) scanf("%d",&a)
    #define ql(a) memset(a,0,sizeof(a))
    int dp[210][105][105];
    int e[105][105];
    int main()
    {
    int t,i,j,n,m;
    int x1,x2,k;
    CIN(t);
    while(t--){ql(e),ql(dp);
    CIN(n),CIN(m);
    for(i=1;i<=n;++i)
    for(j=1;j<=m;++j) CIN(e[i][j]);
    for(k=1;k<n+m-2;++k)
    for(x1=1;x1<=n;++x1)
    for(x2=1;x2<=n;++x2){
    int y1=k+2-x1,y2=k+2-x2;
    if(x1==x2||y1<0||y2<0||y1>m||y2>m) continue;
    dp[k][x1][x2]=max(max(dp[k-1][x1][x2],dp[k-1][x1][x2-1]),max(dp[k-1][x1-1][x2],dp[k-1][x1-1][x2-1]))+e[x1][y1]+e[x2][y2];
    }

    cout<<max(dp[k-1][n-1][n],dp[k-1][n][n-1])+e[n][m]+e[1][1]<<endl;
    }
    return 0;
    }

     注意处理起点如果没有初始化dp[0][x1][x2]的话最后切记加上e[1][1].

    也可以选择先处理dp[0]不过不划算啦

  • 相关阅读:
    HTTP以及TCP协议
    分布式理论
    JAVA基础面试题
    JAVA基础面试题
    vue 中百度富文本初始化内容加载失败(编辑操作某列数据时,富文本中内容偶尔会为空)
    CodeMirror的使用方法
    JSON格式化,JSON.stringify()的用法
    promise与await的用法
    服务器端node.js
    数组扁平化
  • 原文地址:https://www.cnblogs.com/zzqc/p/6665634.html
Copyright © 2020-2023  润新知