博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA Live Achrive 4327 Parade (单调队列,dp)
阅读量:6183 次
发布时间:2019-06-21

本文共 1446 字,大约阅读时间需要 4 分钟。

容易想到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
using namespace std;const int N = 102, M = 1e4+5;int n, m, k;int h[N][M], t[N][M];int dp[N][M];int q[M];//#define LOCALint main(){#ifdef LOCAL freopen("in.txt","r",stdin);#endif while(scanf("%d%d%d", &n, &m, &k), n+m+k){ n++; for(int i = 1; i <= n; i++){ for(int j = 1; j <= m ;j++){ scanf("%d",h[i]+j); h[i][j] += h[i][j-1]; } } for(int i = 1; i <= n; i++){ for(int j = 1; j <= m ;j++){ scanf("%d",t[i]+j); t[i][j] += t[i][j-1]; } } for(int i = 1; i <= n; i++){ #define maintain(diff) while(hd
k) hd++; #define inst(val) while(hd
= 0; j--){ inst(rval) maintain(rdis) dp[i][j] = max(dp[i][j],rval(q[hd])-h[i][j]); } } int ans = 0; for(int j = 0; j <= m; j++){ ans = max(ans,dp[n][j]); } printf("%d\n",ans); } return 0;}

 

转载于:https://www.cnblogs.com/jerryRey/p/4856515.html

你可能感兴趣的文章
中小型企业证书认证服务器的搭建详解
查看>>
ProxmoxVE 之 oracle12C 多CDB和PDB
查看>>
SetFileTime
查看>>
记录新机房建设。20130715
查看>>
POJ 1274 The Perfect Stall 题解 《挑战程序设计竞赛》
查看>>
WinAPI: OpenProcess、GetExitCodeProcess、TerminateProcess (测试强制关闭 OICQ)
查看>>
reboot
查看>>
Ajax+Jsp+servlet+json技术的使用
查看>>
Ajax+JQuery+JSon传输中文字符时,必须注意中文字符的编码解码工作
查看>>
JSP 九大内置对象及其作用域
查看>>
android 在子线程中如何把自定义对象传到handler中处理
查看>>
两分钟彻底让你明白Android Activity生命周期(图文)
查看>>
Nagios出现NRPE: Unable to read output解决办法
查看>>
ipvsadm配合脚本配置LVS
查看>>
tornado实现异步计划任务及python常见计划任务方法
查看>>
jQuery剥皮一
查看>>
自动更新服务导致 Svchost 占用CPU 100%的解决方法
查看>>
Samba共享系统实例应用
查看>>
VMware vSphere 5.1 群集深入解析(二十)- 存储DRS算法
查看>>
Linux Shell学习-sed命令详解
查看>>