【题目链接】

点击打开链接

【算法】

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

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. LINUX下面NetworkManager和network冲突的问题

    https://blog.csdn.net/ID_EAGLE/article/details/74085409

  2. @OneToMany

    实体关系之@OneToMany 博客分类: hibernate & ejb SQL  Order.java package com.entity; import java.io.Seriali ...

  3. 浅谈云网融合与SD-WAN

    一.引言 近年来,SD-WAN作为一项新技术在行业应用领域里快速发展,企业对SD-WAN的接受度日渐提升,各厂商也纷纷提出解决方案.随着全球云计算领域的活跃创新和我国云计算发展进入应用普及阶段,越来越 ...

  4. NOIPSB评测机+SB题DAY2

    忍者钩爪 题目描述 小 Q 是一名酷爱钩爪的忍者, 最喜欢飞檐走壁的感觉, 有一天小 Q 发现一个练习使用钩 爪的好地方,决定在这里大显身手. 场景的天花板可以被描述为一个无穷长的数轴, 初始小 Q ...

  5. 2019年北航OO第3单元(JML)总结

    1 JML语言的理论基础及应用工具链 1.1 JML语言 Java建模语言(JML)是一种行为接口规范语言,可用于指定Java模块的行为.它结合了Eiffel的"契约设计(design by ...

  6. js创建post请求

    /**js提交post请求:隐藏请求参数**/function postDetail(URL, PARAMTERS) { //创建form表单 var temp_form = document.cre ...

  7. Protostuff序列化和反序列化使用说明

    原文:http://blog.csdn.net/zhglance/article/details/56017926 google原生的protobuffer使用起来相当麻烦,首先要写.proto文件, ...

  8. linux 配置maven环境变量

    vi /etc/profile 按照如下样例编辑环境变量. 编辑之后记得使用source /etc/profile命令是改动生效. 5.验证结果 在任意路径下执行mvn -version验证命令是否有 ...

  9. FastDFS的配置、部署与API使用解读(3)以流的方式上传文件的客户端代码(转)

    调用的API为: String[] upload_file( String group_name,//组名,不指定则可设为null long file_size,//文件大小,必须制定 UploadC ...

  10. Linux CentOS下安装、配置mysql数据库

    假设要在Linux上做j2ee开发.首先得搭建好j2ee的开发环境.包含了jdk.tomcat.eclipse的安装(这个在之前的一篇随笔中已经有具体解说了Linux学习之CentOS(七)--Cen ...