UVA Live Achrive 4327 Parade (单调队列,dp)
容易想到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)的更多相关文章
- LA 4327 Parade(单调队列优化dp)
题目链接: 题目大意(摘自刘汝佳<<算法竞赛入门经典--训练指南>>):F城是由n+1条横向路和m+1条竖向路组成.你的任务是从最南边的路走到最北边的路,使得走过的路上的高兴值 ...
- poj3926 parade (单调队列+dp)
题意:有n行路,每行路被分成m段,每一段有长度和权值,要求从最下面一行走到最上面一行某个位置,可以从相邻两行的同一列交点往上走,并且在同一行走的长度要<=K,求走过的最大权值 设f[i][j]为 ...
- POJ 3017 单调队列dp
Cut the Sequence Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 8764 Accepted: 2576 ...
- [TyvjP1313] [NOIP2010初赛]烽火传递(单调队列 + DP)
传送门 就是个单调队列+DP嘛. ——代码 #include <cstdio> ; , t = , ans = ~( << ); int q[MAXN], a[MAXN], f ...
- zstu 4237 马里奥的求救——(单调队列DP)
题目链接:http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?id=4237 这题可以转化为每次可以走g~d+x步,求最大分数,且最大分数的步数最少. ...
- 1304F2 - Animal Observation (hard version) 线段树or单调队列 +DP
1304F2 - Animal Observation (hard version) 线段树or单调队列 +DP 题意 用摄像机观察动物,有两个摄像机,一个可以放在奇数天,一个可以放在偶数天.摄像机在 ...
- Parade(单调队列优化dp)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2490 Parade Time Limit: 4000/2000 MS (Java/Others) ...
- vijos P1243 生产产品(单调队列+DP)
P1243生产产品 描述 在经过一段时间的经营后,dd_engi的OI商店不满足于从别的供货商那里购买产 品放上货架,而要开始自己生产产品了!产品的生产需要M个步骤,每一个步骤都可以在N台机器 ...
- POJ 1821 单调队列+dp
题目大意:有K个工人,有n个墙,现在要给墙涂色.然后每个工人坐在Si上,他能刷的最大范围是Li,且必须是一个连续子区间,而且必须过Si,他刷完后能获得Pi钱 思路:定义dp[i][j]表示前i个人,涂 ...
随机推荐
- 笔记:eclipse的findbugs插件安装成功却不显示
关键字:findbugs eclipse的findbugs插件安装成功却不显示的原因有: 1.插件版本太高,低版本的eclipse不兼容 2.也有可能是JDK版本低 findbugs安装方法: 1.在 ...
- [Xcode 实际操作]四、常用控件-(1)UIButton控件的使用
目录:[Swift]Xcode实际操作 本文将演示按钮控件的使用,按钮是用户界面中最常见的交互控件 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import U ...
- PCB生产企业自动化立体仓库/智能仓库库系统WMS/WCS解决方案
PCB生产企业自动化立体仓库/智能仓库库系统WMS/WCS解决方案 自动化立体仓库智能仓储系统WMS/WCS重要性调查 调查1(物流成本占总生产成本比例数据)1979年英国的第一次调查表明,在从原材料 ...
- Windows日志为什么要把它转成Syslog呢?
有的朋友会问,好好的Windows日志为什么要把它转成Syslog呢?呵呵,当Windows服务器比较少的时候,我们是不需要这样做的.但试想如果你管理着成千上百台的Windows机器,你会一台一台的登 ...
- POJ1010 Stamps
题目来源:http://poj.org/problem?id=1010 题目大意: 某邮局要设计新的邮资管理软件,依据顾客的需要和现有的面值给顾客分派邮票. 该邮局有很多顾客是集邮爱好者.这些人希望得 ...
- Java中keytool管理证书
1.创建证书库以及第一个证书 keytool -genkeypair -alias "wangpass" -keyalg "RSA" -keystore &qu ...
- .netcore中无法使用System.Drawing --解决方案
问题重现: 无法正常使用 解决方法: 安装System.Drawing.Common的NuGet就能正常使用了 操作之后: 这个是.netcoe中的解决办法,.net framework解决方案中添 ...
- git——解决“fatal: Authentication failed for 'https://github.com/balabala”
平复一下心情,到底如何在github上将队友和owner的仓库连接?如何push代码到远程仓库???找了巨多教程,终于解决了~ 刚到公司不久,开始学着用git,在提交代码的时候怎么都提不上去! 解决办 ...
- Shell变量赋值语句不能有空格
a = 1是错的!!!!!只有 a=1才是正确的.
- Nodejs 连接 mysql时报错 Error: Cannot enqueue Query after fatal error
解决办法,参考:https://github.com/chill117/express-mysql-session/issues/18 我们只需在实例化SessionStore的时候,配置useCon ...