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日,星期二,农历七月初四,欢迎阅看今天的颓废联编节目 最近发生的灵异事件有 ...
随机推荐
- devServer之proxy跨域
配置 注意:修改之后要重新运行一遍项目才行 devServer:{ contentBase:'./', proxy:{ // 当你请求是以/api开头的时候,则我帮你代理访问到http://local ...
- linux 查看系统性能
1. 查看内存和CPU信息 cat /proc/cpuinfo cpu信息 cat /proc/meminfo |grep MemTotal 内存信息 查看物 ...
- 关于数据库表设计之区域表system_district:省市县街道四级地址表
关于省市县的数据表的设计有两种方式: 一.将其设计成一张表 DROP TABLE IF EXISTS `system_district`; CREATE TABLE `system_district` ...
- JS中的原型链和原型的认识
这篇文章主要是学习一下JavaScript中的难点------原型和原型链 自定义一个对象 我们学习一门编程语言,必然要使用它完成一些特定的功能,而面向对象的语言因为符合人类的认知规律,在这方面做得很 ...
- 域名与服务器 ip地址的理解
域名 服务器 ip地址具有怎样的关系呢 通俗的讲,我们访问一个网站就相当于访问一个服务器的文件,如果想要通过自己的域名来访问一个网站,首先得将域名部署到你的服务器上,然后就可以通过域名访问到你服务器上 ...
- echarts ajax请求demo
<body> <!--为ECharts准备一个具备大小(宽高)的Dom--> <div id="main" style="width: 10 ...
- Java如何对一个对象进行深拷贝?
在Java语言里,当我们需要拷贝一个对象时,有两种类型的拷贝:浅拷贝与深拷贝.浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化.而深拷贝则是拷贝了源对象的所有值,所以即 ...
- SQL optimizer -Query Optimizer Deep Dive
refer: http://sqlblog.com/blogs/paul_white/archive/2012/04/28/query-optimizer-deep-dive-part-1.aspx ...
- Android——NativeActivity - C/C++ Apk开发
android基本的四大组件之一Activity,android开发的第一个hello world 创建的就是这个继承了Activity类的类,拥有对应的生命周期,由AMS维护,只需要重写父类对应的方 ...
- [Python]切换工作目录|python将目录切换为脚本所在目录
Python使用os.chdir命令切换python工作目录 代码示例: In []: import os In []: os.system("pwd") /home/wangju ...