poj3926
dp+优化
很明显可以用单调队列优化。
记录下自己犯的sb错误: 数组开小,sum没搞清。。。
#include<cstdio>
#include<cstring>
using namespace std;
const int N = , M = ;
int n, m, k, ans;
int q[M];
int dp[N][M], sum[N][M], dis[N][M];
inline int max(int x, int y)
{
return x > y ? x : y;
}
inline int read()
{
int x = , f = ; char c = getchar();
while(c < '' || c > '') { if(c == '-') f = -; c = getchar(); }
while(c >= '' && c <= '') { x = x * + c - ''; c = getchar(); }
return x * f;
}
int main()
{
//dp[i][j] = dp[i - 1][x] + sum[j] - sum[x - 1]
//dp[i][j] = dp[i - 1][x] + sum[x] - sum[j - 1]
while(scanf("%d%d%d", &n, &m, &k))
{
memset(dp, , sizeof(dp));
ans = ;
if(n == && m == && k == ) break;
++n;
++m;
for(int i = ; i <= n; ++i)
for(int j = ; j <= m; ++j)
{
int x;
x = read();
sum[i][j] = sum[i][j - ] + x;
}
for(int i = ; i <= n; ++i)
for(int j = ; j <= m; ++j)
{
int x;
x = read();
dis[i][j] = dis[i][j - ] + x;
}
for(int i = ; i <= n; ++i)
{
int l = , r = ;
q[++r] = ;
for(int j = ; j <= m; ++j)
{
while(l <= r && dp[i - ][j] - sum[i][j] > dp[i - ][q[r]] - sum[i][q[r]]) --r;
q[++r] = j;
while(l <= r && dis[i][j] - dis[i][q[l]] > k) ++l;
dp[i][j] = dp[i - ][q[l]] + sum[i][j] - sum[i][q[l]];
}
l = ;
r = ;
q[++r] = m;
for(int j = m; j; --j)
{
while(l <= r && dp[i - ][j] + sum[i][j] > dp[i - ][q[r]] + sum[i][q[r]]) --r;
q[++r] = j;
while(l <= r && dis[i][q[l]] - dis[i][j] > k) ++l;
dp[i][j] = max(dp[i][j], dp[i - ][q[l]] + sum[i][q[l]] - sum[i][j]);
if(i == n) ans = max(ans, dp[i][j]);
}
}
printf("%d\n", ans);
}
return ;
}
poj3926的更多相关文章
- poj3926 parade (单调队列+dp)
题意:有n行路,每行路被分成m段,每一段有长度和权值,要求从最下面一行走到最上面一行某个位置,可以从相邻两行的同一列交点往上走,并且在同一行走的长度要<=K,求走过的最大权值 设f[i][j]为 ...
随机推荐
- 显示log里的ansi codecs颜色字符
方法: vim AnsiEsc插件 http://www.vim.org/scripts/script.php?script_id=302 less -r cat和tail命令都可以正常显示,而且ta ...
- 【技术累积】【线】【java】【2】AOP
思维导图 基础概念 翻译:面向切面编程,或面向方面编程: 是OOP的重要补充: 切面:传统的OOP构建的是对象之间的关系,是一种垂直的关系:假设,OOP程序是一个圆筒,那么与业务或逻辑无关的东西,比如 ...
- atom 插件安装【转载】
http://www.cnblogs.com/20145221GQ/p/5334762.html 问题: 输入apm install后,可能一直没有响应,要强行退. 不知道安装的时候可不可以打开ato ...
- excel 类获取起始列和使用列
m_excel.OpenWorkBook(sFileName, sSheetDrawingList); // Get drawing info int iStartRow = 0, iStartCol ...
- xadmin站点管理类
9. Xadmin xadmin是Django的第三方扩展,比使用Django的admin站点更强大也更方便. 文档:https://xadmin.readthedocs.io/en/latest/i ...
- 数据结构与算法(5) -- deque
vector是单向开口的连续线性空间,deque则是一种双向开口的连续线性空间.所谓双向开口,意思是可以在头尾两端分别做元素的插入和删除操作.stl中deque与vector最大的差异,一在于dequ ...
- (C/C++学习)13.C语言字符串处理函数(一)
说明:字符串处理的函数很多,本文将例举经常遇到的一些函数加以说明. 一.字符串的输入输出 头文件:<stdio.h> 1.利用标准输出函数 printf() 来输出,将格式设置为 s% . ...
- 6.range filter进行范围过虑
主要知识点 掌握range filter的用法 range filter就是查找一个范围内的数据,相当于sql中的betwen语法,以下是几个示例: 1.为帖子数据增加浏览量的字段 ...
- js中阻止事件冒泡和浏览器默认行为
在使用javascript编程时会遇到一个问题,就是当你给html添加事件时,由于浏览器默认的为冒泡型事件触发机制,所以会触发你不想触发的事件.那么通过如下的函数可以解决这个问题.[兼容IE和FF] ...
- Huawei-R&S-网络工程师实验笔记20190607-STP生成树协议(基本配置、桥优先级、根桥选举、根端口、路径开销、边缘端口)
>Huawei-R&S-网络工程师实验笔记20190607-STP生成树协议(基本配置.桥优先级.根桥选举.根端口.路径开销.边缘端口) >>实验开始,先上拓扑图参考: &l ...