这题我有闪过是用单调队列优化的想法,也想过有左右两边各烧一遍。 但是不敢确定,搜了题解,发现真的是用单调队列,然后写了好久,调了好久下标应该怎么变化才过的。

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(单调队列优化)的更多相关文章

  1. BestCoder Round #89 02单调队列优化dp

    1.BestCoder Round #89 2.总结:4个题,只能做A.B,全都靠hack上分.. 01  HDU 5944   水 1.题意:一个字符串,求有多少组字符y,r,x的下标能组成等比数列 ...

  2. 单调队列优化DP,多重背包

    单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...

  3. 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 ...

  4. [poj3017] Cut the Sequence (DP + 单调队列优化 + 平衡树优化)

    DP + 单调队列优化 + 平衡树 好题 Description Given an integer sequence { an } of length N, you are to cut the se ...

  5. UESTC 880 生日礼物 --单调队列优化DP

    定义dp[i][j]表示第i天手中有j股股票时,获得的最多钱数. 转移方程有: 1.当天不买也不卖: dp[i][j]=dp[i-1][j]; 2.当天买了j-k股: dp[i][j]=max(dp[ ...

  6. poj 1821 Fence 单调队列优化dp

    /* poj 1821 n*n*m 暴力*/ #include<iostream> #include<cstdio> #include<cstring> #incl ...

  7. 使用单调队列优化的 O(nm) 多重背包算法

    我搜索了一下,找到了一篇很好的博客,讲的挺详细:链接. 解析 多重背包的最原始的状态转移方程: 令 c[i] = min(num[i], j / v[i]) f[i][j] = max(f[i-1][ ...

  8. hdu3401:单调队列优化dp

    第一个单调队列优化dp 写了半天,最后初始化搞错了还一直wa.. 题目大意: 炒股,总共 t 天,每天可以买入na[i]股,卖出nb[i]股,价钱分别为pa[i]和pb[i],最大同时拥有p股 且一次 ...

  9. 1023: [SHOI2008]cactus仙人掌图(DP+单调队列优化)

    这道题吗= =首先解决了我多年以来对仙人掌图的疑问,原来这种高大上的东西原来是这个啊= = 然后,看到这种题,首先必须的就是缩点= = 缩点完之后呢,变成在树上找最长路了= =直接树形dp了 那么那些 ...

随机推荐

  1. POJ 2632 Crashing Robots (坑爹的模拟题)

    Crashing Robots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6599   Accepted: 2854 D ...

  2. POJ 3321 Apple Tree DFS序+fenwick

    题目大意:有一颗长满苹果的苹果树,有两个操作. 1.询问以一个点为根的子树中有多少个苹果. 2.看看一个点有没有苹果,假设没有苹果.那么那里就立即长出一个苹果(= =!):否则就把那个苹果摘下来. 思 ...

  3. sql server 2005 外围应用配置器

    想要实现sql server 2005 远程连接数据库,我们必需要用到sql05上自带的外围配置器,以下是对它的一些配置上的介绍: 首先我们要打开sql05外围配置器,例如以下图: 打开后,我们如今就 ...

  4. 积累的VC编程小技巧之按钮

    1.资源种创建的控件,对其属性的动态控制: 在对话框类的头文件里创建所要改变属性的控件的对象,如要改变一个Button(其ID为IDC_MyButton)的属性,则需创建Cbutton的对象m_but ...

  5. Android菜鸟的成长笔记(10)——使用Bundle在Activity之间传值

    原文:[置顶] Android菜鸟的成长笔记(10)——使用Bundle在Activity之间传值 前面我们了解了如何启动一个Activity,一个Activity在启动另外一个Activity的时候 ...

  6. HDU3714 Error Curves (单峰函数)

    大意: 给你n个二次函数Si(x),F(x) = max{Si(x)} 求F(x)在[0,1000]上的最小值. S(x)=ax^2+bx+c       (0<=a<=100, |b|, ...

  7. LV在系统重启后不能自动激活(boot.lvm&after.loca)

    同类相关文章:http://blog.csdn.net/laven54/article/details/9121661 最近发现suse11sp2的系统解决了异常死机的问题之后,又引入了另外的问题,比 ...

  8. C语言常用的宏

    01: 防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDEF_H //头文件内容 #endif 02: 重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类 ...

  9. EasyUI初体验--右键弹框

    在C/S中可能非常easy实现右键弹框,但在B/S中直到今天我才搞定,小小得瑟一下.只一个html页面,导入相关的Easy-UI类库就能搞定,Easy-UI类库下载地址 <!DOCTYPE ht ...

  10. VS2010使用静态编译的qt库

    Qt开发界面很方便,但发布程序就不那么方便了,你的把引用到的dll一起发布才行,要是能静态编译就好了,发布的时候只有一个exe多方便. 虽然以前为了方便,直接安装的qt-windows-opensou ...