【题目链接】

点击打开链接

【算法】

不难看出,这题可以用动态规划来解决

f[i][j]表示第i行第j列能够取得的最大分数

则如果向右走,状态转移方程为f[i][j]=max{f[i-1][k]+a[i][k]+a[i][k+1]+...+a[i][j]}(i-T<=k<=j)

如果向左走,则状态转移方程为f[i][j]=max{f[i-1][k]+a[i][k]+a[i][k-1]+...+a[i][j]}  (j<=k<=i+T)

用前缀和优化,s[i][j]表示第i行前j个数的和

则式子被简化为 :

向右走 : f[i][j] = max{f[i-1][k]+s[i][j]-s[i][k-1]} (i-T<=k<=j)

向左走 : f[i][j] = max{f[i-1][k]+s[i][k]-s[i][j-1]} (j<=k<=i+T)

但是这样做还是会TLE,所以我们继续优化 :

我们可以将第一个状态转移方程中s[i][j]提出,式子被写成f[i][j] = max{f[i-1][k]-s[i][k-1]}+s[i][j] (i-T<=k<=j)

将第二个状态转移方程中s[i][j-1]提出,式子被写成f[i][j] = max{f[i-1][k]+s[i][k]}+s[i][j-1] (j<=k<=i+T)

于是我们就可以用单调队列维护最值,时间复杂度 : O(数据组数*N*M)

【代码】

#include<bits/stdc++.h>
using namespace std;
#define MAXN 100
#define MAXM 10000 typedef long long LL; struct info {
LL x,val;
};
LL i,j,N,M,X,T,tmp,ans;
LL a[MAXN+][MAXM+],s[MAXN+][MAXM+],f[MAXN+][MAXM+];
deque<info> q; template <typename T> inline void read(T &x) {
LL f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) { if (c == '-') f = -f; }
for (; isdigit(c); c = getchar()) x = x * + c - '';
x *= f;
}
template <typename T> inline void write(T x) {
if (x < ) { putchar('-'); x = -x; }
if (x > ) write(x/);
putchar(x%+'');
}
template <typename T> inline void writeln(T x) {
write(x);
puts("");
} int main() { while (cin >> N >> M >> X >> T) {
ans = -2e9;
for (i = ; i <= N; i++) {
for (j = ; j <= M; j++) {
read(a[i][j]);
}
} for (i = ; i <= N; i++) {
for (j = ; j <= M; j++) {
s[i][j] = s[i][j-] + a[i][j];
}
} for (i = ; i <= N; i++) {
for (j = ; j <= M; j++) {
f[i][j] = -2e9;
}
}
for (i = X; i >= X - T; i--) f[][i] = s[][X] - s[][i-];
for (i = X; i <= X + T; i++) f[][i] = s[][i] - s[][X-]; for (i = ; i <= N; i++) {
q.clear();
for (j = ; j <= M; j++) {
while ((!q.empty()) && (j - q.front().x > T)) q.pop_front();
tmp = f[i-][j] - s[i][j-];
while ((!q.empty()) && (tmp >= q.back().val)) q.pop_back();
q.push_back((info){j,tmp});
f[i][j] = q.front().val + s[i][j];
}
q.clear();
for (j = M; j >= ; j--) {
while ((!q.empty()) && (q.front().x - j > T)) q.pop_front();
tmp = f[i-][j] + s[i][j];
while ((!q.empty()) && (tmp >= q.back().val)) q.pop_back();
q.push_back((info){j,tmp});
f[i][j] = max(f[i][j],q.front().val-s[i][j-]);
}
}
for (i = ; i <= M; i++) ans = max(ans,f[N][i]);
writeln(ans);
} return ; }

【hdu 4374】One Hundred Layer的更多相关文章

  1. 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题

    [HDU  3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...

  2. 【HDU 5647】DZY Loves Connecting(树DP)

    pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...

  3. -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】

    [把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...

  4. 【HDU 2196】 Computer(树的直径)

    [HDU 2196] Computer(树的直径) 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 这题可以用树形DP解决,自然也可以用最直观的方法解 ...

  5. 【HDU 2196】 Computer (树形DP)

    [HDU 2196] Computer 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 刘汝佳<算法竞赛入门经典>P282页留下了这个问题 ...

  6. 【HDU 5145】 NPY and girls(组合+莫队)

    pid=5145">[HDU 5145] NPY and girls(组合+莫队) NPY and girls Time Limit: 8000/4000 MS (Java/Other ...

  7. 【hdu 1043】Eight

    [题目链接]:http://acm.hdu.edu.cn/showproblem.php?pid=1043 [题意] 会给你很多组数据; 让你输出这组数据到目标状态的具体步骤; [题解] 从12345 ...

  8. 【HDU 3068】 最长回文

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3068 [算法] Manacher算法求最长回文子串 [代码] #include<bits/s ...

  9. 【HDU 4699】 Editor

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4699 [算法] 维护两个栈,一个栈放光标之前的数,另外一个放光标之后的数 在维护栈的同时求最大前缀 ...

随机推荐

  1. 【westorm系列之二】配置格式化

    1.执行格式化后,给句尾加分号

  2. Docker如何部署Python项目

    Docker 部署Python项目 作者:白宁超 2019年5月24日09:09:00 导读: 软件开发最大的麻烦事之一就是环境配置,操作系统设置,各种库和组件的安装.只有它们都正确,软件才能运行.如 ...

  3. UVA11825 Hackers' Crackdown

    题目描述 PDF 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 3 2 1 2 2 0 2 2 0 1 4 1 1 1 0 1 3 1 2 0 输出样例#1: Case 1: 3 ...

  4. spark与Scala安装过程和步骤及sparkshell命令的使用

    Spark与Scala版本兼容问题: Spark运行在Java 8 +,Python 2.7 + / 3.4 +和R 3.1+上.对于Scala API,Spark 2.4.2使用Scala 2.12 ...

  5. 微软CIO如何与业务部门打交道?

    微软公司副总裁兼CIO Tony Scott是一个非常智慧的人,他拒绝和CEO讨论IT成本的问题,认为IT不应该谈论成本,而是应该谈论IT提供服务的价值.在满足业务部门需求.为业务部门提供适当的IT支 ...

  6. android 获得屏幕宽度和高度

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools= ...

  7. UP Board USB无线网卡选购指南

    前言 原创文章,转载引用务必注明链接,水平有限,欢迎指正. 本文环境:ubilinux 3.0 kernel 4.4.0 本文使用Markdown写成,为获得更好的阅读体验和正常的图片.链接,请访问我 ...

  8. 关于结构体的具体解说,C、C++中的差别

    1. C.C++内置的类型分两种,一种是基本数据类型.一种是复合数据类型.此处我们要讲的结构体便是复合数据类型. 先来讨论一下结构体存在的意义吧.或许你觉得主要的数据类型就够了,为什么还要有结构题这样 ...

  9. centos Linux 常用命令汇总

    CentOS 关闭防火墙 1) 永久性生效,重启后不会复原 开启: chkconfig iptables on 关闭: chkconfig iptables off 2) 即时生效,重启后复原 开启: ...

  10. java开始到熟悉62

    (说明:昨天网络出现了问题导致昨天的没有按时上传,这篇算是昨天的,今天晚上照常上传今天的内容) 本次主题:数组拷贝.排序.二分法 1.数组拷贝 a.java.lang中System 类包含一些有用的类 ...