【问题描述】
小空正在玩一个叫做捡金币的游戏。游戏在一个被划分成 n行 n列的网格状场地中进行。
每一个格子中都放着若干金币,并且金币的数量会随着时间而不断变化。 小空的任务就是在
网格中移动,拾取尽量多的金币。 并且,小空还有一个特殊技能“闪现”, 能帮助她在网格间
快速移动。
捡金币游戏的具体规则如下:在每一秒开始时,每个网格内都会出现一定数量的金币,
而之前在这格没有被拾取的金币就消失了。在游戏开始时,也就是第 1 秒的开始,小空可以
选择任意一个网格作为起点开始本次游戏,并拾取起点内的金币。之后,在下一秒到来前,
小空可以选择走路移动到与她所在的格子上、下、左、右相邻的一个格子中,或者呆在原地
不动,并在下一秒开始时拾取到她所在的格子中的金币。或者,小空可以选择使用闪现技能,
使用一次闪现时,她先选择上、下、左、右一个方向,之后向该方向移动两格。小空可以在
一秒内使用多次闪现,但不能超过 C 次。在一秒内使用的多次闪现必须向同一个方向移动,
若使用 x 次闪现,便可以向一个方向移动正好 2x 格,并且她也只能在下一秒开始时收集到
连续闪现结束后所在的那一格中的金币。如果在某一秒钟小空使用了闪现,那么她就不能选
择通过走路移动了,反过来也是如此。无论走路或者使用闪现,小空都不能移动到整个场地
之外。整个游戏共进行 T 秒,在第 T 秒开始时,小空将会拾取她所在的格子中的金币,并结
束游戏。 小空在整局游戏内一共只能使用最多 W 次闪现。

现在,给出游戏场地的大小 n,每秒钟开始时各个位置会出现的金币数,小空一秒内最
多使用闪现的次数 C, 小空在整局游戏中使用闪现的最多次数 W,整局游戏的总时间 T,请
你告诉小空她最多可以获得多少枚金币。

【输入】

输入的第 1 行包含 4 个整数 n, C, W, T,意义如问题描述中所述。
接下来包含 n 个 n*n 的矩阵,第 k 个矩阵的第 i 行第 j 列表示第 i 行第 j 列的格子在第 k
秒开始时出现的金币数( 记作si,j,k)。 相邻两个矩阵间用一个空行隔开。
【 输出】
输出包含一个整数,表示游戏结束时小空最多可以获得的金币数量。
【输入输出样例 1】

coin.in coin.out
3 1 1 3
1 3 4
3 2 1
1 3 2
2 3 1
1 3 2
2 1 4
3 3 1
3 2 1
2 3 1
11

见选手目录下的 coin / coin1.in 与 coin / coin1.out
【输入输出样例 1 说明】
选择在第 1 行第 3 列开始游戏, 获得 4 枚金币;在第 2 秒开始时向下闪现到第 3 行第 3
列, 获得 4 枚金币;在第 3 秒开始时向左走到第 3 行第 2 列,获得 3 枚金币, 游戏结束。一
共获得 11 枚金币。
【输入输出样例 2】
见选手目录下的 coin / coin2.in 与 coin / coin2.out
【数据规模与约定】

测试点编号 n C W T si,j,k
1 ≤5 ≤2 ≤4 ≤5 ≤1,000
2
3
4 ≤21 ≤10 ≤80 ≤80
5
6
7 ≤25 =100 ≤150 ≤100
8
9 ≤12
10

对 100%的数据, n≥1, C≥0, W≥0, T≥1, si,j,k≥0

/*
方程并不难,主要通过这个题学一下单调队列
*/
#include <cstdio>
#define inf 1000000007
int a[][][],f[][][][],q[],qc[],v[][],cnt,n,C,W,T,i,j,k,t,ii,jj,kk,tt,l,r,
ans,ch,tag; void read(int &x)
{
for (ch=getchar(); ch<=; ch=getchar());
for (x=; ch>; ch=getchar()) x = x*+ch-;
} void update(int &x, int y)
{
if (y > x) x = y;
} void clear()
{
l=; r=;
q[] = inf;
q[] = -inf;
cnt = ;
} void push(int x)
{
q[++r] = x;
qc[r] = ;
q[r+] = -inf;
while (q[r] >= q[r-])
{
qc[r-] += qc[r];
q[r-] = q[r];
q[r--] = -inf;
}
if (++cnt > C) if (--qc[l] == ) q[l++] = inf;
} int main()
{
freopen("coin.in", "r", stdin);
freopen("coin.out", "w", stdout);
scanf("%d%d%d%d", &n, &C, &W, &T);
for (t=; t<=T; ++t)
for (i=; i<=n; ++i)
for (j=; j<=n; ++j) read(a[t][i][j]);
for (i=; i<=n; ++i)
for (j=; j<=n; ++j) f[][i][j][] = a[][i][j];
t = ;
for (tt=; tt<=T; ++tt)
{
t ^= ;
for (i=; i<=n; ++i)
for (j=; j<=n; ++j)
for (k=; k<=W; ++k) f[t][i][j][k] = -inf;
for (i=; i<=n; ++i)
{
++tag;
for (jj=; jj<=n; ++jj)
for (kk=; kk<=W; ++kk)
if (v[jj][kk] != tag)
{
clear();
j = jj;
k = kk;
while (j<=n && k<=W)
{
v[j][k] = tag;
update(f[t][i][j][k], q[l]);
push(f[t^][i][j][k]);
j += ;
k++;
}
}
++tag;
for (jj=n; jj>=; --jj)
for (kk=; kk<=W; ++kk)
if (v[jj][kk] != tag)
{
clear();
j = jj;
k = kk;
while (j>= && k<=W)
{
v[j][k] = tag;
update(f[t][i][j][k], q[l]);
push(f[t^][i][j][k]);
j -= ;
k++;
}
}
}
for (j=; j<=n; ++j)
{
++tag;
for (ii=; ii<=n; ++ii)
for (kk=; kk<=W; ++kk)
if (v[ii][kk] != tag)
{
clear();
i = ii;
k = kk;
while (i<=n && k<=W)
{
v[i][k] = tag;
update(f[t][i][j][k], q[l]);
push(f[t^][i][j][k]);
i += ;
k++;
}
}
++tag;
for (ii=n; ii>=; --ii)
for (kk=; kk<=W; ++kk)
if (v[ii][kk] != tag)
{
clear();
i = ii;
k = kk;
while (i>= && k<=W)
{
v[i][k] = tag;
update(f[t][i][j][k], q[l]);
push(f[t^][i][j][k]);
i -= ;
k++;
}
}
}
for (i=; i<=n; ++i)
for (j=; j<=n; ++j)
for (k=; k<=W; ++k)
{
update(f[t][i][j][k], f[t^][i-][j][k]);
update(f[t][i][j][k], f[t^][i+][j][k]);
update(f[t][i][j][k], f[t^][i][j-][k]);
update(f[t][i][j][k], f[t^][i][j+][k]);
update(f[t][i][j][k], f[t^][i][j][k]);
f[t][i][j][k] += a[tt][i][j];
}
}
for (i=; i<=n; ++i)
for (j=; j<=n; ++j)
for (k=; k<=W; ++k) update(ans, f[t][i][j][k]);
printf("%d\n", ans);
return ;
}

清北学堂模拟day4 捡金币的更多相关文章

  1. 清北学堂模拟day4 传球接力

    [问题描述]n 个小朋友在玩传球. 小朋友们用 1 到 n 的正整数编号. 每个小朋友有一个固定的传球对象,第 i 个小朋友在接到球后会将球传给第 ai个小朋友, 并且第 i 个小朋友与第 ai个小朋 ...

  2. 清北学堂模拟day4 业务办理

    [问题描述]在银行柜台前,有 n 个顾客排队办理业务. 队伍中从前往后,第 i 位顾客办理业务需要ti 分钟时间. 一位顾客的等待时间定义为:队伍中在他之前的所有顾客和他自己的办理业务时间的总和.第 ...

  3. 清北学堂模拟赛day7 数字碰撞

    /* clj:水题别人都满分你不是你就完了,所以说水题一定要细心一点,有这么几个细节:①前导零的处理,全是零的时候要特判②换行要注意,不要多大一行,剩下就是水水的模拟了 */ #include< ...

  4. 清北学堂模拟赛d4t1 a

    分析:大模拟,没什么好说的.我在考场上犯了一个超级低级的错误:while (scanf("%s",s + 1)),导致了死循环,血的教训啊,以后要记住了. /* 1.没有发生改变, ...

  5. 清北学堂模拟赛day7 错排问题

    /* 考虑一下已经放回m本书的情况,已经有书的格子不要管他,考虑没有书的格子,不考虑错排有(n-m)!种,在逐步考虑有放回原来位置的情况,已经放出去和已经被占好的格子,不用考虑,剩下全都考虑,设t=x ...

  6. 清北学堂模拟赛day7 石子合并加强版

    /* 注意到合并三堆需要枚举两个端点,其实可以开一个数组记录合并两堆的结果,标程好像用了一个神奇的优化 */ #include<iostream> #include<cstdio&g ...

  7. 清北学堂模拟day6 兔子

    [问题描述] 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3条或更多的路径与它相连,其它的兔子窝只有1条或2条路径与其相连.换句话讲,这些兔子 ...

  8. 清北学堂模拟day6 圆桌游戏

    [问题描述] 有一种圆桌游戏是这样进行的:n个人围着圆桌坐成一圈,按顺时针顺序依次标号为1号至n号.对1<i<n的i来说,i号的左边是i+1号,右边是i-1号.1号的右边是n号,n号的左边 ...

  9. 清北学堂模拟day6 花

    [问题描述] 商店里出售n种不同品种的花.为了装饰桌面,你打算买m支花回家.你觉得放两支一样的花很难看,因此每种品种的花最多买1支.求总共有几种不同的买花的方案?答案可能很大,输出答案mod p的值. ...

随机推荐

  1. Compiler Theory(编译原理)、词法/语法/AST/中间代码优化在Webshell检测上的应用

    catalog . 引论 . 构建一个编译器的相关科学 . 程序设计语言基础 . 一个简单的语法制导翻译器 . 简单表达式的翻译器(源代码示例) . 词法分析 . 生成中间代码 . 词法分析器的实现 ...

  2. CSS基础知识真难啊-position-relative-absolute

    http://blog.csdn.net/libertea/article/details/11662661 -----------position:relative:生成相对定位的元素,相对于其正常 ...

  3. Wget下载终极用法和15个详细的例子

    Wget下载终极用法和15个详细的例子 备注:wget  不支持https 下载,也没有相关https参数,当下载https的时候或以改用 axelWget是一种很好用的因特网下载工具,他具有的很多特 ...

  4. Java——不弹起的按钮组件:JToggleButton

    import java.awt.GridLayout; import javax.swing.JFrame; import javax.swing.JToggleButton; //========= ...

  5. Java数据库——事务处理

    在数据库中执行5条SQL语句,这些SQL语句本身需要保持一致,即要么同时成功,要么同时失败 事务基本操作 //============================================= ...

  6. BufferedReader类

    BufferedReader类用于从缓冲区中读取内容,多有的输入字节数据都将放在缓冲区中. BufferedReader中定义的构造方法只能接收字符输入流的实例,所以必须使用字符输入流和字节输入流的转 ...

  7. rem是如何实现自适应布局的?

    http://caibaojian.com/web-app-rem.html 使用rem 然后根据媒体查询实现自适应.跟使用JS来自适应适配也是同个道理,不过是js更精确一点.使用媒体查询: html ...

  8. 如何在Flash Builder里新建ActionScript工程

    新建ActionScript工程 1. File > New > ActionScript Project 2. 按照提示完成工程的创建 使程序直接在Flash Player中运行 1. ...

  9. Language Tool ,a plugin for TeXStudio

    Language Tool ,a plugin for TeXStudio TexStudio supports LanguageTool as an inline grammar checker. ...

  10. <?xml version="1.0" encoding="utf-16"?>. use different encoding

    public string Serialize<T>(T serializeClass) { string xmlString = string.Empty; try { if (seri ...