题解

首先对 \(a\) 离散化,则可推出转移方程

\[dp_{i,j}=\max\{{dp_{{i^{'}},{j^{'}}}+|i-i^{'}|+|j-j^{'}|}\}+b_{i,j} \;\;(a_{i,j}=a_{{i^{'}},{j^{'}}}+1)
\]

其中按离散化后 \(a\) 递增 \(1\) 跳,一定为最优(易证)

这个方程复杂度为 \(\mathcal O(n^2m^2)\),优化:

此题可以发现每个 \(dp_{i,j}\) 都可以由 左上,右上,左下,右下 转移过来。所以用数组维护一下最大值:

\[(1,1)−(i,j):dp_{i,j}−i−j
\]
\[(1,j)−(i,m):dp_{i,j}−i+j
\]
\[(i,1)−(n,j):dp_{i,j}+i−j
\]
\[(i,j)−(n,m):dp_{i,j}+i+j
\]

贴张学长的图

现在证明一下为什么不用判断一个点在另一个点的位置就可以转移

证明:

设贡献点为 \(t_1\),被转移点为 \(t_2\)

若 \(t_1\) 在 \(t_2\) 左上方,从右下方转移,则 \(dp_{t_{2}}=dp_{t_{1}}-i-j-i'-j'\) ,但若从左上方转移 \(dp_{t_{2}}=dp_{t_{1}}+i+j-i'-j'\)

显然第一种不合法转移会被更优的且合法的第二种转移覆盖,其它情况同理

证毕

Code:
#include<bits/stdc++.h>
#define ri register signed
#define p(i) ++i
using namespace std;
namespace IO{
char buf[1<<21],*p1=buf,*p2=buf;
#define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++
template<typename T>inline void read(T &x) {
ri f=1;x=0;register char ch=gc();
while(ch<'0'||ch>'9') {if (ch=='-') f=0;ch=gc();}
while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
x=f?x:-x;
}
}
using IO::read;
namespace nanfeng{
#define node(x,y,a,b) (node){x,y,a,b}
#define cmax(x,y) ((x)>(y)?(x):(y))
#define cmin(x,y) ((x)>(y)?(y):(x))
#define FI FILE *IN
#define FO FILE *OUT
typedef long long ll;
static const int N=2e3+7;
int a[N][N],b[N][N],wk[N*N],p[N*N],cnt,n,m;
ll dp[N*N],pre[4],mx[4];
struct node{int x,y,a,b;}pnt[N*N];
inline int cmp(int x,int y) {return pnt[x].a<pnt[y].a;}
inline int main() {
// FI=freopen("nanfeng.in","r",stdin);
// FO=freopen("nanfeng.out","w",stdout);
read(n),read(m);
for (ri i(1);i<=n;p(i)) for (ri j(1);j<=m;p(j)) read(a[i][j]);
for (ri i(1);i<=n;p(i))
for (ri j(1);j<=m;p(j)) {
read(b[i][j]);
if (a[i][j]) p[p(cnt)]=cnt,pnt[cnt]=node(i,j,a[i][j],b[i][j]);
}
sort(p+1,p+cnt+1,cmp);
ri cut=INT_MAX;
dp[1]=pnt[p[1]].b;
mx[0]=cmax(mx[0],dp[1]+pnt[p[1]].x+pnt[p[1]].y);
mx[1]=cmax(mx[1],dp[1]-pnt[p[1]].x+pnt[p[1]].y);
mx[2]=cmax(mx[2],dp[1]+pnt[p[1]].x-pnt[p[1]].y);
mx[3]=cmax(mx[3],dp[1]-pnt[p[1]].x-pnt[p[1]].y);
for (ri i(2);i<=cnt;p(i)) {
ri x=p[i],y=p[i-1];
if (pnt[x].a!=pnt[y].a) {cut=i;break;}
dp[i]=pnt[x].b;
mx[0]=cmax(mx[0],dp[i]+pnt[x].x+pnt[x].y);
mx[1]=cmax(mx[1],dp[i]-pnt[x].x+pnt[x].y);
mx[2]=cmax(mx[2],dp[i]+pnt[x].x-pnt[x].y);
mx[3]=cmax(mx[3],dp[i]-pnt[x].x-pnt[x].y);
}
for (ri i(cut);i<=cnt;p(i)) {
ri x=p[i],y=p[i-1];
if (pnt[x].a!=pnt[y].a) {
pre[0]=mx[0],pre[1]=mx[1],pre[2]=mx[2],pre[3]=mx[3];
mx[0]=mx[1]=mx[2]=mx[3]=0;
}
x=pnt[x].x,y=pnt[p[i]].y;
dp[i]=cmax(pre[0]-x-y,cmax(pre[1]+x-y,cmax(pre[2]-x+y,pre[3]+x+y)))+(ll)pnt[p[i]].b;
mx[0]=cmax(mx[0],dp[i]+x+y);
mx[1]=cmax(mx[1],dp[i]-x+y);
mx[2]=cmax(mx[2],dp[i]+x-y);
mx[3]=cmax(mx[3],dp[i]-x-y);
}
register ll ans=0;
for (ri i(1);i<=cnt;p(i)) ans=cmax(ans,dp[i]);
printf("%lld\n",ans);
return 0;
}
}
int main() {return nanfeng::main();}

不要忘记开 \(long\;\;long\)

NOIP 模拟 $11\; \rm biology$的更多相关文章

  1. NOIP 模拟 $11\; \rm english$

    题解 本题有一定代码难度 对于需要区间最大值,可以反过来考虑,先预处理出每个数所能扩展的最大边界,也就是说,求出一个最大的区间,其最大值为这个数,单调栈 \(\mathcal O(n)\) 求解 那么 ...

  2. NOIP 模拟 $11\;\rm math$

    题解 签到题(然而还是不会) 考虑所有可能的值一定是 \(\in [0,k)\),且一定为 \(gcd(a_1,a_2,...a_n,k)\) 的倍数. 证明: 设 \(tmp=b_1a_1+b_2a ...

  3. 8.1 NOIP模拟11

    8.1 NOIP模拟 11 今天上午返校之后,颓了一会,然后下午就开始考试,中午睡着了,然后刚开始考试的时候就困的一匹,我一看T1,woc,这不是之前线段树专题的题啊,和那道题差不多,所以我..... ...

  4. 6.11考试总结(NOIP模拟7)

    背景 时间分配与得分成反比,T1 20min 73pts,T2 1h 30pts,T3 2h 15pts(没有更新tot值,本来应该是40pts的,算是本次考试中最遗憾的地方了吧),改起来就是T3比较 ...

  5. NOIP模拟 1

    NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. #   用  户  名   ...

  6. 2021.5.22 noip模拟1

    这场考试考得很烂 连暴力都没打好 只拿了25分,,,,,,,,好好总结 T1序列 A. 序列 题目描述 HZ每周一都要举行升旗仪式,国旗班会站成一整列整齐的向前行进. 郭神作为摄像师想要选取其中一段照 ...

  7. NOIP 模拟 $24\; \rm matrix$

    题解 \(by\;zj\varphi\) 发现 \(\rm n,m\) 都很小,考虑分行状压. 但是上一行和下一行的按钮状态会对当前行造成影响,所以再枚举一个上一行的按钮状态. 因为对于两行,只有如下 ...

  8. NOIP 模拟 $20\; \rm y$

    题解 \(by\;zj\varphi\) 首先发现一共最多只有 \(2^d\) 种道路,那么可以状压,(不要 \(dfs\),会搜索过多无用的状态) 那么设 \(f_{i,j,k}\) 为走 \(i\ ...

  9. noip第11课作业

    1.    数字比较 定义一个函数check(n,d),让它返回一个布尔值,如果数字d在正整数n的某位中出现则返回true,否则返回false. 例如:check(325719,3)==true:ch ...

随机推荐

  1. 流媒体传输协议(rtp/rtcp/rtsp/rtmp/mms/hls)转

    常用的流媒体协议主要有HTTP渐进下载和基于RTSP/RTP的实时流媒体协议两类.在流式传输的实现方案中,一般采用HTTP/TCP来传输控制信息,而用RTP/UDP来传输实时多媒体数据. 1 实时传输 ...

  2. 续PA协商过程

    续PA协商过程 当sw3的接口恢复之后会发生2中情况. ①sw3的G0/0/2口先发BPDU ②sw3的G0/0/3口先发BPDU sw3先发送BPDU sw3和sw1的交互过程: sw3的2口恢复后 ...

  3. [TJOI2007]书架 题解

    文中给了你一些句子,以及让你任意插入某个位置以及查询某个位置的句子. 发现因为是句子很难搞,所以开个 map 离散一下成数字.然后在额外开一个 map 记录这个数字对应的句子. 然后你要写一种支持插入 ...

  4. C++ 标准模板库(STL)——容器(Containers)的用法及理解

    C++ 标准模板库(STL)中定义了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量(vector).队列(queue).栈(stack).set.map等.这次主要 ...

  5. Java基础00-内部类23

    1. 内部类 内部类 1.1 内部类概述 代码示例: 1.2 成员内部类 代码示例: 创建一个成员内部类:定义时没有小括号是因为类是没有形参的.在类的成员位置,就是成员内部类了 创建测试类:这里发现不 ...

  6. UI作品评审总结:切忌过度设计,注意设计闭环

    本期,我们一起看看学长认证模块--UI同学的作品评审.   拿好小板凳,做好笔记,我们开始吧!     我们拿了两个典型的作品进行了一个讲解,做的特色都还不错,但是都有些小问题.   先来看一下第一位 ...

  7. Easyui动态添加控件无法渲染 $.parser.parse()无效

    本文链接:https://blog.csdn.net/huangbaokang/article/details/78367553动态添加easyui控件<input class="ea ...

  8. Python开发篇——如何在Flask下编写JWT登录

    首先,HTTP 是无状态的协议(对于事务处理没有记忆能力,每次客户端和服务端会话完成时,服务端不会保存任何会话信息)--每个请求都是完全独立的,服务端无法确认当前访问者的身份信息,无法分辨上一次的请求 ...

  9. kms激活windows或者office

    激活windows和office windows激活密钥 Windows 10 Professional(专业版):W269N-WFGWX-YVC9B-4J6C9-T83GX Windows 10 P ...

  10. SpringBoot数据访问之Druid启动器的使用

    数据访问之Druid启动器的使用 承接上文:SpringBoot数据访问之Druid数据源的自定义使用 官方文档: Druid Spring Boot Starter 首先在在 Spring Boot ...