uvalive4327(单调队列优化)
这题我有闪过是用单调队列优化的想法,也想过有左右两边各烧一遍。 但是不敢确定,搜了题解,发现真的是用单调队列,然后写了好久,调了好久下标应该怎么变化才过的。
dp[i][j] 表示走到第i行,第j个竖线的最大价值。
dp[i][j] = max(dp[i-1][k]+pre[i][j-1]-pre[i][k-1]); 从左往右
dp[i][j] = max(dp[i][j],dp[i-1][k]+suf[i][j]-suf[i][k]); 从右往左
#pragma warning(disable:4996)
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <math.h>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <bitset>
#include <algorithm>
#include <iostream>
#include <string>
#include <functional>
const int INF = << ;
typedef __int64 LL;
/*
dp[i][j]表示走到第i个横线,第j个竖线的最大值
dp[i][j] = max(dp[i-1][k] + sum[j-1] - sum[k-1])
单调队列优化维护队首最大值,
*/ int q[], head, tail;
int dp[][];
int a[][];
int b[][];
int pre[][], suf[][];
int sum1[][];
int sum2[][];
int main()
{
int n, m, k; while (scanf("%d%d%d", &n, &m, &k),n+m+k)
{
memset(dp, , sizeof(dp));
memset(pre, , sizeof(pre));
memset(suf, , sizeof(suf));
memset(sum1, , sizeof(sum1));
memset(sum2, , sizeof(sum2));
n++;
for (int i = ;i <= n;++i)
{
for (int j = ;j <= m;++j)
{
scanf("%d", &a[i][j]);
pre[i][j] = pre[i][j - ] + a[i][j];
suf[i][j] = a[i][j];
}
for (int j = m;j >= ;--j)
suf[i][j] += suf[i][j + ]; }
for (int i = ;i <= n;++i)
{
for (int j = ;j <= m;++j)
{
scanf("%d", &b[i][j]);
sum1[i][j] = b[i][j];
sum2[i][j] = sum2[i][j - ] + b[i][j];
}
for (int j = m;j >= ;--j)
sum1[i][j] += sum1[i][j + ];
}
for (int i = n;i >= ;--i)
{
head = tail = ;
for (int j = ;j <= m + ;++j)
{
while (head < tail && dp[i + ][j] - pre[i][j - ] >= dp[i + ][q[tail - ]] - pre[i][q[tail - ] - ])
tail--;
q[tail++] = j;
while (head<tail && sum2[i][j-] - sum2[i][q[head]-]>k)
head++;
dp[i][j] = dp[i + ][q[head]] + pre[i][j - ] - pre[i][q[head]-];
}
head = tail = ; for (int j = m+;j >= ;--j)
{
while (head < tail&&dp[i + ][j] - suf[i][j ] >= dp[i + ][q[tail - ]] - suf[i][q[tail - ] ])
tail--;
q[tail++] = j;
while (head<tail&&sum1[i][j] - sum1[i][q[head]]>k)
head++;
dp[i][j] =std::max(dp[i][j], dp[i + ][q[head]] + suf[i][j] - suf[i][q[head]]);
}
}
int ans = ;
for (int j = ;j <= m + ;++j)
ans = std::max(ans, dp[][j]);
printf("%d\n", ans);
}
return ;
}
uvalive4327(单调队列优化)的更多相关文章
- BestCoder Round #89 02单调队列优化dp
1.BestCoder Round #89 2.总结:4个题,只能做A.B,全都靠hack上分.. 01 HDU 5944 水 1.题意:一个字符串,求有多少组字符y,r,x的下标能组成等比数列 ...
- 单调队列优化DP,多重背包
单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...
- bzoj1855: [Scoi2010]股票交易--单调队列优化DP
单调队列优化DP的模板题 不难列出DP方程: 对于买入的情况 由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]} AP[i]*j是固定的,在队列中维护dp[i-w ...
- [poj3017] Cut the Sequence (DP + 单调队列优化 + 平衡树优化)
DP + 单调队列优化 + 平衡树 好题 Description Given an integer sequence { an } of length N, you are to cut the se ...
- UESTC 880 生日礼物 --单调队列优化DP
定义dp[i][j]表示第i天手中有j股股票时,获得的最多钱数. 转移方程有: 1.当天不买也不卖: dp[i][j]=dp[i-1][j]; 2.当天买了j-k股: dp[i][j]=max(dp[ ...
- poj 1821 Fence 单调队列优化dp
/* poj 1821 n*n*m 暴力*/ #include<iostream> #include<cstdio> #include<cstring> #incl ...
- 使用单调队列优化的 O(nm) 多重背包算法
我搜索了一下,找到了一篇很好的博客,讲的挺详细:链接. 解析 多重背包的最原始的状态转移方程: 令 c[i] = min(num[i], j / v[i]) f[i][j] = max(f[i-1][ ...
- hdu3401:单调队列优化dp
第一个单调队列优化dp 写了半天,最后初始化搞错了还一直wa.. 题目大意: 炒股,总共 t 天,每天可以买入na[i]股,卖出nb[i]股,价钱分别为pa[i]和pb[i],最大同时拥有p股 且一次 ...
- 1023: [SHOI2008]cactus仙人掌图(DP+单调队列优化)
这道题吗= =首先解决了我多年以来对仙人掌图的疑问,原来这种高大上的东西原来是这个啊= = 然后,看到这种题,首先必须的就是缩点= = 缩点完之后呢,变成在树上找最长路了= =直接树形dp了 那么那些 ...
随机推荐
- 【免费】iPhone上最好用的短信群发软件: 高速短信4.1
免费的最新的联系人.群组.多人发送短信软件短信群发4.1已经出炉.欢迎下载! *归属地信息让你时时记着好友的地方,让陌生号码变得不陌生: *您能够选择最经常使用的联系人然后发送高速短信; *群联系人 ...
- SDUT Fermat’s Chirstmas Theorem(素数筛)
Fermat's Chirstmas Theorem Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描写叙述 In a letter ...
- Introduction to Probability (三) Independence
两个事件独立性的定义是:事件A的发生对事件B的发生毫无影响,即从A的发生与否.我们不能猜測出B是否发生. 从概率等式的表示来看就是B在A发生的情况下发生的概率等于B发生的概率本身. 进而引出了A与B同 ...
- 可以根据柜子内表取出所有的柜子信息的BAPI函数
DATA: gt_hunumbers TYPE STANDARD TABLE OF bapihunumber, gt_huitem TYPE STANDARD TABLE OF bapih ...
- Linux下Qt4与qt5的程序使用输入法(ibus与fcitx)不冲突
这篇文章引用了较多其他作者的内容,也忘记引用的出处了,只能感谢了.以下转入正题. 对于qt5.5,要下载libqt库源码自己编译,参考解决Qt5 Creator无法切换输入法(fcitx),Ubunt ...
- unity中怎样获取全部子物体的组件
public GameObject[] obj; void Awake() { for (int i = 0; i < obj.Length; i++) ...
- JSP的include指令
JSP的include 指令:向当前页面中插入的一个静态文件的内容. 在test5.jsp里面 <%@ include file="test5_1.jsp" %> 新建 ...
- QML中多样化的ListModel(MultiDelegate)
在QML的官方例子里面, 基本上都是一样的Delegate, 也就是说不管数据怎样, 样式都是不变的. 如果我们想要根据不同的数据类型来显示不同的UI该怎么办? 这里有一个例子. DataBank L ...
- Delphi事件的广播2
上篇文章写了将事件分离成类的方法来实现事件的广播,这次将参考观察者模式来实现事件的广播.模式中主要有这两个角色: 发布者:发布者保存着一张观察者的列表,以便在必要的时候调用观察者的方法. 观察者:观察 ...
- Delphi使用StrToDatetime在不同操作系统出现不同的情况(控制面板的时间格式都记录在注册表里,因此也可修改注册表)
Str:= '2010-4-13 06:22:22'; StrToDateTime(Str); 现象:在WinXP, Win2003 都不会报错 但是在Windows7,Windows Serve ...