容易想到dp[i][j]表示在第i行j个路口的开始走最大高兴值。

每次可以向左走,或者向右边走,然后向北走。(或者直接往北)

向左走到,状态转移为dp[i][j] = dp[i][k] + happy[i][k][j](为了方便处理,i从1开始编号,0行dp值存0)

处理出前缀和,happy[i][k][j]表示为sum[i][j] - sum[i][k]

向左走应该取max(dp[i][k]-sum[i][k])

k应该满足time[i][k][j] <= k

随着j的变化k的范围是一个滑动窗口,用单调队列去维护。

右边走转移 dp[i][k] + sum[i][k] - sum[i][j],类似处理。

转移为O(1),复杂度为O(N*M)

#include<bits/stdc++.h>
using namespace std; const int N = , M = 1e4+;
int n, m, k;
int h[N][M], t[N][M];
int dp[N][M];
int q[M]; //#define LOCAL
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
while(scanf("%d%d%d", &n, &m, &k), n+m+k){
n++;
for(int i = ; i <= n; i++){
for(int j = ; j <= m ;j++){
scanf("%d",h[i]+j);
h[i][j] += h[i][j-];
}
}
for(int i = ; i <= n; i++){
for(int j = ; j <= m ;j++){
scanf("%d",t[i]+j);
t[i][j] += t[i][j-];
}
} for(int i = ; i <= n; i++){
#define maintain(diff) while(hd<rl && diff(j,q[hd]) > k) hd++;
#define inst(val) while(hd<rl && val(q[rl-1]) <= val(j)) rl--; q[rl++] = j;
int hd = , rl = ;
#define dis(x) (t[i][x])
#define lval(x) (dp[i-1][x] - h[i][x])
#define ldis(j,k) dis(j)-dis(k)
for(int j = ; j <= m; j++){
inst(lval)
maintain(ldis)
dp[i][j] = lval(q[hd])+h[i][j];
}
hd = rl = ;
#define rval(x) (dp[i-1][x] + h[i][x])
#define rdis(j,k) dis(k)-dis(j)
for(int j = m; j >= ; j--){
inst(rval)
maintain(rdis)
dp[i][j] = max(dp[i][j],rval(q[hd])-h[i][j]);
}
}
int ans = ;
for(int j = ; j <= m; j++){
ans = max(ans,dp[n][j]);
}
printf("%d\n",ans);
}
return ;
}

UVA Live Achrive 4327 Parade (单调队列,dp)的更多相关文章

  1. LA 4327 Parade(单调队列优化dp)

    题目链接: 题目大意(摘自刘汝佳<<算法竞赛入门经典--训练指南>>):F城是由n+1条横向路和m+1条竖向路组成.你的任务是从最南边的路走到最北边的路,使得走过的路上的高兴值 ...

  2. poj3926 parade (单调队列+dp)

    题意:有n行路,每行路被分成m段,每一段有长度和权值,要求从最下面一行走到最上面一行某个位置,可以从相邻两行的同一列交点往上走,并且在同一行走的长度要<=K,求走过的最大权值 设f[i][j]为 ...

  3. POJ 3017 单调队列dp

    Cut the Sequence Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8764   Accepted: 2576 ...

  4. [TyvjP1313] [NOIP2010初赛]烽火传递(单调队列 + DP)

    传送门 就是个单调队列+DP嘛. ——代码 #include <cstdio> ; , t = , ans = ~( << ); int q[MAXN], a[MAXN], f ...

  5. zstu 4237 马里奥的求救——(单调队列DP)

    题目链接:http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?id=4237 这题可以转化为每次可以走g~d+x步,求最大分数,且最大分数的步数最少. ...

  6. 1304F2 - Animal Observation (hard version) 线段树or单调队列 +DP

    1304F2 - Animal Observation (hard version) 线段树or单调队列 +DP 题意 用摄像机观察动物,有两个摄像机,一个可以放在奇数天,一个可以放在偶数天.摄像机在 ...

  7. Parade(单调队列优化dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2490 Parade Time Limit: 4000/2000 MS (Java/Others)    ...

  8. vijos P1243 生产产品(单调队列+DP)

      P1243生产产品   描述 在经过一段时间的经营后,dd_engi的OI商店不满足于从别的供货商那里购买产 品放上货架,而要开始自己生产产品了!产品的生产需要M个步骤,每一个步骤都可以在N台机器 ...

  9. POJ 1821 单调队列+dp

    题目大意:有K个工人,有n个墙,现在要给墙涂色.然后每个工人坐在Si上,他能刷的最大范围是Li,且必须是一个连续子区间,而且必须过Si,他刷完后能获得Pi钱 思路:定义dp[i][j]表示前i个人,涂 ...

随机推荐

  1. 将图片至于jsp页面上(层)

    <div style="position: relative"> <span style="position: relative; top: 1px; ...

  2. EIGRP-7-可靠传输协议

    可靠传输协议(RTP,Reliable Transport Protocol)负责管理ElGRP数据包的发送和接收.可靠传输意味着传输是有保障的,并且数据包会被按顺序发送.这种传输效果是依靠Cisco ...

  3. Unity PlayerPrefs

    对于游戏存档,储存最高分,排行榜都需要用到储存,现在存储的方式有很多,可以存本地的Json,XML,Sqlite,还有一种就是unity自带的一种存储PlayerPrefs. 那么这个PlayerPr ...

  4. Python 的execfile用法

    可以直接执行脚本 而import是将脚本导入另一个文件里,可以看 http://docs.python.org/2/library/functions.html 例如一个Python文件 a.py: ...

  5. 牛客网Java刷题知识点之基本类型、引用类型

    不多说,直接上干货! byte-short-int-long,方便识记.

  6. 【计算机网络】ssl双向认证和单向认证原理

    有朋友在搞一个项目,周末有聊到一些安全性的东西,很自然会想起https,但https究竟如何实施,其原理又是什么? 基于ssl,一般的应用都是单向认证,如果应用场景要求对客户来源做验证也可以实现成双向 ...

  7. Aura Component Skills & Tools

    本篇参考: https://trailhead.salesforce.com/content/learn/modules/lex_dev_lc_vf_fundamentals 不知不觉已经做了三年多的 ...

  8. java 从List<Integer> 中随机获取6个数

    List<Integer> list 为不重复的数字集合,例如:1,2,3,4,5,6,7,8,9,10 从中随机获取不重复的6个数.代码如下. List<Integer> l ...

  9. 在MFC对话框中快速集成三维控件

    在MFC的对话框中可以方便的集成AnyCAD三维控件(c++版本),遵循一下几步: 1.在对话框资源中增加一个Static控件,ID为IDC_STATIC_3D,并且把它的Notify属性设置为Tru ...

  10. webpack.config.js====配置babel

    参考:https://www.jianshu.com/p/9808f550c6a91. 安装依赖babel-loader: 负责 es6 语法转化babel-preset-env: 包含 es6.7 ...