2019中山纪念中学夏令营-Day20[JZOJ]

提高组B组 Team_B组

T1 旅游 Time Limits: 2000 ms  Memory Limits: 262144 KB

Description

ztxz16如愿成为码农之后,整天的生活除了写程序还是写程序,十分苦逼。终于有一天,他意识到自己的生活太过平淡,于是决定外出旅游丰富阅历。

ztxz16生活的城市有N*M个景点,可以描述成一个N*M的矩形,每个景点有一个坐标(x, y) (1 <= x <= N, 1 <= y <= M)以及美观度A[x][y]和观赏所需的时间B[x][y],从一个景点(x1, y1)走到另一个景点(x2, y2)需要时间为它们之间的曼哈顿距离:|x1 - x2| +|y1 - y2|。

为了防止审美疲劳,ztxz16希望观赏的景点的的美观度是严格上升的,由于不想太早回家码代码,ztxz16希望旅游的总时间尽可能长。

 

Input

第一行输入两个整数N, M;

接下来N行每行M个整数,第x行第y个整数代表A[x][y];

接下来N行每行M个整数,第x行第y个整数代表B[x][y];

注意,有一些A[x][y]=B[x][y]=0,说明这个景点已经拆除,不能游览;

Output

输出一行代表最长的总时间。
 

Sample Input

4 5
1 2 6 0 2
1 3 4 0 4
0 0 4 0 3
2 2 0 0 4
1 3 5 0 2
2 8 1 0 2
0 0 3 0 4
0 5 0 0 3

Sample Output

39
【样例说明】
游览顺序为(2,1)->(1,5)->(2,2)->(4,5)->(1,3)
 
 

Data Constraint

对于30%的数据:1<=N<=50 , 1<=M<=50

对于60%的数据:1<=N<=300 , 1<=M<=300

对于100%的数据:1<=N<=1000 , 1<=M<=1000

0<=A[x][y]<=1000000

0<=B[x][y]<=10^9

注意:本题输入数据较大,请注意输入消耗的时间

官方正解:

用f[x][y]表示游览到(x,y)时可能的最长时间,将曼哈顿距离中的绝对值展开后,转移可以表示为四个子矩形中求max的问题,可以使用二维树状数组维护
继续观察发现因为题目要求总长度尽可能长,因此每个点只会在正确的子矩形中贡献最大的答案,因此不需要使用二维树状数组,只需按符号考虑四种情况即可

听说好像要用四边形不等式(反正我也不懂,就瞎搞吧)

我的思路:

先用结构体存矩阵,使其压成一维,然后开始DP乱搞

我们显然可以发现,最优解一定是从上一个观赏度和当前观赏度之差绝对值最小的地方转换过来的

因此可以给DP剪掉一些不可能最优的转移,因为每个点i的bi(即观赏时间)是一定的,我们可以把它从转移式中提出来。

状态转移方程:

其中:k为上一阶段的观赏度的点排序后的编号(用来剪不必要的转移用的),如果不理解的话可以将j=0,但是会慢很多。

代码实现:

 #include <cstdio>
#include <algorithm>
#define rr register
#define int long long
using std::sort;
int n,m,f[*],mark1,mark2,maxn,h[][];
struct Node{
int x,y,a,b;
}node[*];
bool cmp(Node k,Node l)
{
return k.a<l.a;
}
int max(int k,int l)
{
if(k>l)
return k;
return l;
}
int abs(int k)
{
if(k<)
return -k;
return k;
}
signed main()
{
scanf("%lld %lld",&n,&m);
int tot=;
for(rr int i=;i<=n;i++)
for(rr int j=;j<=m;j++)
{
scanf("%lld",&h[i][j]);
}
tot=;
for(rr int i=;i<=n;i++)
for(rr int j=;j<=m;j++)
{
int tmp;
scanf("%lld",&tmp);
if(tmp== && h[i][j]==)
continue;
node[tot].a=h[i][j];
node[tot].b=tmp;
node[tot].x=i;
node[tot].y=j;
tot++;
}
tot--;
sort(node+,node+tot+,cmp);
for(rr int i=;i<=tot;i++)
{
if(node[i].a>node[i-].a)
{
mark2=mark1;
mark1=i-;
}
if(node[i].a== && node[i].b==)
continue; for(rr int j=max(mark2,);j<i;j++)
{
if(node[i].a>node[j].a)
{
if(f[i] < f[j]+abs(node[i].x-node[j].x)+abs(node[i].y-node[j].y))
f[i] = f[j]+abs(node[i].x-node[j].x)+abs(node[i].y-node[j].y);
}
}
f[i]+=node[i].b;
maxn=max(maxn,f[i]);
} printf("%lld",maxn);
}

2019中山纪念中学夏令营-Day20[JZOJ] T1旅游详解的更多相关文章

  1. 2019中山纪念中学夏令营-Day21[JZOJ]

    2019中山纪念中学夏令营-Day21[JZOJ] 提高组(B组模拟赛)Team_B (由于本人太弱,并没有订正完题目) (题解大部分是从官方题解文件上摘来的) 日常膜拜大神:じやゆん蒟蒻 正文部分: ...

  2. 2019中山纪念中学夏令营-Day4[JZOJ]

    Begin (题目的排序方式:难易程度) 什么是对拍: 对拍是一种在写完程序后,验证自己程序是不是正解的比较方便的方法. 实现过程: 对同一道题,再打一个暴力程序,然后用一些大数据等跑暴力程序来进行验 ...

  3. 2019中山纪念中学夏令营-Day12[JZOJ]

    Begin (题目的排序方式:题号) 每期新姿势:(今天推荐一位巨佬)Cefola-Kiroxs 推荐知识:namespace的用法(本赛我的代码中将用到) 2019.08.12[NOIP普及组]模拟 ...

  4. 2019中山纪念中学夏令营-Day9[JZOJ](第六次模拟赛)

    Begin (题目的排序方式:Unkown其实是按心情排的) 异或:(摘自百度百科) 异或(xor)是一个数学运算符.它应用于逻辑运算.异或的数学符号为“⊕”,计算机符号为“xor”.其运算法则为: ...

  5. 2019中山纪念中学夏令营-Day2[JZOJ]

    博客的开始,先聊聊代码实现: 每次比赛以后,要有归纳错误的习惯. 错误小结: 1.读入:scanf(“%c”)会读入回车和空格,但cin不会. 2.对于二维数组的输入,不能把m,n搞混了,会引起严重的 ...

  6. 2019中山纪念中学夏令营-Day1[JZOJ]

    T1 题目描述: 1999. Wexley接苹果(apple) (File IO): input:apple.in output:apple.out 时间限制: 1000 ms  空间限制: 1280 ...

  7. 2019中山纪念中学夏令营-Day14 图论初步【dijkstra算法求最短路】

    Dijkstra是我学会的第一个最短路算法,为什么不先去学SPFA呢?因为我在luogu上翻到了一张比较神奇的图: 关于SPFA -它死了 以及网上还有各位大佬的经验告诉我:SPFA这玩意很容易被卡. ...

  8. 2019中山纪念中学夏令营-Day19 数论初步【GCD(最大公约数),素数相关】

    关于GCD的一些定理或运用的学习: 1. 2.二进制算法求GCD 思想:使得最后的GCD没有2(提前把2提出来) 代码实现: #include <cstdio> #define int l ...

  9. [小结] 中山纪念中学2018暑期训练小结(划掉)(颓废记)-Day10

    [小结] 中山纪念中学2018暑期训练小结(划掉)(颓废记)-Day10 各位看众朋友们,你们好,今天是2018年08月14日,星期二,农历七月初四,欢迎阅看今天的颓废联编节目 最近发生的灵异事件有 ...

随机推荐

  1. numpy中np.max() 和 np.maximum() 的区别

    np.max(a, axis=None, out=None, keepdims=False) # 接收一个参数a # 取a 在 axis方向上的最大值 np.maximum(x, y) # 接收两个参 ...

  2. CSS 中蒙版相关设置二三事

    写 蒙版 时会使用透明度,第一反应会使用 opacity 但这个会使子元素继承,蒙版内还有内容会被影响,从而会设置 background 属性的 rgba 值. 需要注意的是 rgba 和 gba 颜 ...

  3. TCP输出 之 tcp_write_xmit

    概述 tcp_write_xmit函数完成对待发送数据的分段发送,过程中会遍历发送队列,进行窗口检查,需要TSO分段则分段,然后调用tcp_transmit_skb发送数据段: 源码分析 static ...

  4. SRS之SrsRtmpConn::stream_service_cycle详解

    首先使用 obs 推流符合如下流程:参考自 Hanvision Makito X cann't publish to SRS.. FFMPEG: C/S: Handshake C: ConnectAp ...

  5. POJ 3128 Leonardo's Notebook (置换)

    Leonardo's Notebook Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2324   Accepted: 98 ...

  6. Oracle 表空间扩容

    1 系统表空间扩容 注:表空间监测或扩容方式很多,这里只提供一种方便使用的方法 1)查询SQL 注:需要输入百分比,如:90,就可查出使用率超过90%的表空间, with t as (select b ...

  7. oracle查看表空间的大小及使用情况sql语句

    --------------------------tablespace------------------------------------------------ 1.//查看表空间的名称及大小 ...

  8. koa 基础(十四)cookie 的基本使用

    1.app.js /** * cookie的简介: * 1.cookie保存在浏览器客户端 * 2.可以让我们用同一个浏览器访问同一个域名的时候共享数据 * * cookie的作用: * 1.保存用户 ...

  9. Struts ognl表达式语言几个符号

    #  获取非根元素值  . 动态都建map集合 $  配置文件取值 %  提供一个ognl表达式运行环境 <%@ page language="java" import=&q ...

  10. SOAP1.1&SOAP1.2

    http://www.webxml.com.cn/webservices/ChinaTVprogramWebService.asmx?op=getTVstationString SOAP 1.1 以下 ...