2019中山纪念中学夏令营-Day20[JZOJ] T1旅游详解
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 3Sample 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旅游详解的更多相关文章
- 2019中山纪念中学夏令营-Day21[JZOJ]
2019中山纪念中学夏令营-Day21[JZOJ] 提高组(B组模拟赛)Team_B (由于本人太弱,并没有订正完题目) (题解大部分是从官方题解文件上摘来的) 日常膜拜大神:じやゆん蒟蒻 正文部分: ...
- 2019中山纪念中学夏令营-Day4[JZOJ]
Begin (题目的排序方式:难易程度) 什么是对拍: 对拍是一种在写完程序后,验证自己程序是不是正解的比较方便的方法. 实现过程: 对同一道题,再打一个暴力程序,然后用一些大数据等跑暴力程序来进行验 ...
- 2019中山纪念中学夏令营-Day12[JZOJ]
Begin (题目的排序方式:题号) 每期新姿势:(今天推荐一位巨佬)Cefola-Kiroxs 推荐知识:namespace的用法(本赛我的代码中将用到) 2019.08.12[NOIP普及组]模拟 ...
- 2019中山纪念中学夏令营-Day9[JZOJ](第六次模拟赛)
Begin (题目的排序方式:Unkown其实是按心情排的) 异或:(摘自百度百科) 异或(xor)是一个数学运算符.它应用于逻辑运算.异或的数学符号为“⊕”,计算机符号为“xor”.其运算法则为: ...
- 2019中山纪念中学夏令营-Day2[JZOJ]
博客的开始,先聊聊代码实现: 每次比赛以后,要有归纳错误的习惯. 错误小结: 1.读入:scanf(“%c”)会读入回车和空格,但cin不会. 2.对于二维数组的输入,不能把m,n搞混了,会引起严重的 ...
- 2019中山纪念中学夏令营-Day1[JZOJ]
T1 题目描述: 1999. Wexley接苹果(apple) (File IO): input:apple.in output:apple.out 时间限制: 1000 ms 空间限制: 1280 ...
- 2019中山纪念中学夏令营-Day14 图论初步【dijkstra算法求最短路】
Dijkstra是我学会的第一个最短路算法,为什么不先去学SPFA呢?因为我在luogu上翻到了一张比较神奇的图: 关于SPFA -它死了 以及网上还有各位大佬的经验告诉我:SPFA这玩意很容易被卡. ...
- 2019中山纪念中学夏令营-Day19 数论初步【GCD(最大公约数),素数相关】
关于GCD的一些定理或运用的学习: 1. 2.二进制算法求GCD 思想:使得最后的GCD没有2(提前把2提出来) 代码实现: #include <cstdio> #define int l ...
- [小结] 中山纪念中学2018暑期训练小结(划掉)(颓废记)-Day10
[小结] 中山纪念中学2018暑期训练小结(划掉)(颓废记)-Day10 各位看众朋友们,你们好,今天是2018年08月14日,星期二,农历七月初四,欢迎阅看今天的颓废联编节目 最近发生的灵异事件有 ...
随机推荐
- D. Make a Permutation!(思维)
D. Make a Permutation! time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- Remainder Problem
F. Remainder Problem 这个其实并不难,只是看看考察有没有分块的思路 思路:用一个ans[i][j]来记录所有k=(1~5e5)中所有a[k]%i==j的和,在查询的时候可以达到复杂 ...
- JSTL的forEach标签中的属性具体含义
JSTL的forEach标签在JSP页面经常替代Java脚本的循环语句,生成多个记录的信息.一般只需 一个一个的展示记录即可,有些需要获取当前记录的索引.在需要获取当前记录的索引的时候可能 有点麻烦, ...
- python3.8 := and python3.7 dataclass
代码示例 from dataclasses import field,dataclass @dataclass class People: name :str =field(init="张三 ...
- POJ 3128 Leonardo's Notebook (置换)
Leonardo's Notebook Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2324 Accepted: 98 ...
- nginx中location匹配规则介绍
一,匹配规则 1,= 表示精确匹配 例子:http://localhost/ 将匹配到 location = / {...} http://localhost/aaa 可以匹配到 location ...
- Centos7 yum install chrome
一.配置 yun 源 vim /etc/yum.repos.d/google-chrome.repo [google-chrome] name=google-chrome baseurl=http:/ ...
- Java-GC 垃圾收集器(HotSpot)
垃圾收集器为垃圾收集算法的具体实现,是执行垃圾收集算法的,是守护线程. HotSpot 虚拟机采用分代收集(JVM 规范并未对堆区进行划分),将堆分为年轻代和老年代,垃圾收集器也按照这样区分.不过已有 ...
- LC 413. Arithmetic Slices
A sequence of number is called arithmetic if it consists of at least three elements and if the diffe ...
- Linux - 搭建Web项目(Django + nginx + uwsgi)
工作中碰到需要使用Django + nginx + uwsgi 搭建项目环境 1. 搭建基本环境 需要有python环境,不多做说明 需要安装nginx,不多做说明 需要安装uwsgi: yum in ...