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]不过不划算啦

时间: 2024-12-29 06:57:07

zzuli 1875多线DP的相关文章

dp--悬线dp P4147 玉蟾宫

题目背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成N*M个格子,每个格子里写着'R'或者'F',R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda. 现在freda要在这里卖萌...它要找一块矩形土地,要求这片土地都标着'F'并且面积最大. 但是rainbow和freda的OI水平都弱爆了,找不出这块土地,而蓝兔也想看freda卖萌(她显然是不会编程的……),所以它们决

zzuli 2172 队列优化dp

2172: GJJ的日常之购物 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 9  Solved: 8 SubmitStatusWeb Board Description 一天,GJJ去购物,来到商场门口,GJJ计划要买n个商品,第i个商品的坐标为(xi,yi),重量是wi. GJJ比较任性,想按照商品编号从小到大的顺序将所有的商品的搬到车里(车在(0,0)的位置): GJJ可以几个商品一起搬,但在任何时候GJJ手中的商品重量不能超过最大载重C.

displayport

去年买了一张ATI的显卡,但是很坑爹的是显卡后面没有VGA接口,除了一个HDMI,另外两个接口不认识,后来认识了DVI,用DVI连接显示器,剩下一个接口是什么一直没管,前两天电脑清灰,感兴趣了,去查了一下,原来这个接口叫做display_port(DP),是从2006年提出的接口,而且,这两年风头强劲,变种出来的eDP在很多嵌入式设备上也有使用,比如,苹果的ipad就是用了edp接口 接口定义如下 DisplayPort是由美国视频电子协会(VESA:Video Electronics Stan

AcWing - 131 - 直方图中最大的矩形 = 单调栈

https://www.acwing.com/problem/content/133/ 单调栈的模板题,按道理悬线dp不用的话也可以这样做. 需要注意这道题不能直接dp,比如[3,5,4],这组数据,3可以拓展5,但5不能拓展4,不过3可以拓展4. #include<bits/stdc++.h> using namespace std; typedef long long ll; int n; ll a[100005]; int l[100005]; int r[100005]; stack&

BZOJ 1057: [ZJOI2007]棋盘制作 悬线法求最大子矩阵+dp

1057: [ZJOI2007]棋盘制作 Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳.而我们的主人公小Q,正是国际象棋的狂热爱好者.作为一个顶尖高手,他已不满足于普通的棋盘与规则,于是他跟他的好朋友小W决定将棋盘扩大以适应他们的新规则.小Q找到了一张由N*M个正方形的格子组成的矩形纸片,每个格子被涂有黑白两种颜色之一.小Q想在这种纸中裁减

BZOJ 1057: [ZJOI2007]棋盘制作( dp + 悬线法 )

对于第一问, 简单的dp. f(i, j)表示以(i, j)为左上角的最大正方形, f(i, j) = min( f(i + 1, j), f(i, j + 1), f(i + 1, j + 1)) + 1 (假如(i, j)和右边和下边不冲突) 第二问就是经典的悬线法解决最大子矩阵了, 维护悬线H[i][j], 左边右边延伸的最长距离.先一行一行求出这一行的L, R, 然后再从上往下扫, 维护H, L, R 写完我才发现我脑残了...最大的正方形一定是在最大子矩阵里面啊...所以其实不用dp.

【bzoj1057】【ZJOI2007】【棋盘制作】【悬线法+dp】

Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳.而我们的主人公小Q,正是国际象棋的狂热爱好者.作为一个顶尖高手,他已不满足于普通的棋盘与规则,于是他跟他的好朋友小W决定将棋盘扩大以适应他们的新规则.小Q找到了一张由N*M个正方形的格子组成的矩形纸片,每个格子被涂有黑白两种颜色之一.小Q想在这种纸中裁减一部分作为新棋盘,当然,他希望这个棋盘尽可

BZOJ 1057 ZJOI 2007 棋盘制作 DP+悬线法

题目大意:给出一个由01形成的矩阵,问这个矩阵中最大面积的正方形和矩形,其中任意一个方块相邻的都是不同的格子. 思路:其实吧所有(i + j)&1的位置上的数字异或一下,就变成都是0或者都是1的最大正方形和矩形了.第一问就是水DP,第二问可以单调栈或者悬线.都很好写. CODE: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define

[Bzoj3677][Apio2014]连珠线(树形dp)

3677: [Apio2014]连珠线 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 434  Solved: 270[Submit][Status][Discuss] Description 在列奥纳多·达·芬奇时期,有一个流行的童年游戏,叫做“连珠线”.不出所料,玩这个游戏只需要珠子和线,珠子从1到礼编号,线分为红色和蓝色.游戏 开始时,只有1个珠子,而接下来新的珠子只能通过线由以下两种方式被加入: 1.Append(w,杪):-个新的珠子w