Luogu 2254 [NOI2005]瑰丽华尔兹
简单dp,设$f_{i,j,k}$表示第i个时间段,钢琴处在(j,k)位置移动距离的最大值,那么有转移
$f_{i, j, k} = max(f_{i - 1, j, k}) , f_{i, j, k} = max(f_{i - 1, a, b})$
其中
$j - dx_{d_{i}} * len\leq a \leq j -1 $
$k - dy_{d_{i}} * len\leq b \leq k -1 $
$len = ed_{i} - st_{i} + 1 $
其实就是一个滑动窗口,考虑到转移顺序,就是写四遍单调队列~
但是我成功地把方程写错了…… i - 1 写成了 i ,改掉就A了
Code:
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std; const int N = ; int n, m, segNum, st[N], ed[N], d[N];
int fx, fy, f[N][N][N], q[N];
char mp[N][N]; inline void read(int &X) {
X = ;
char ch = ;
int op = ;
for(; ch > ''|| ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} inline void chkMax(int &x, int y) {
if(y > x) x = y;
} inline void print(int p) {
printf("\n%d\n", p);
for(int i = ; i <= n; i++, printf("\n"))
for(int j = ; j <= m; j++)
printf("%10d ", f[p][i][j]);
system("pause");
} int main() {
read(n), read(m), read(fx), read(fy), read(segNum);
for(int i = ; i <= n; i++) scanf("%s", mp[i] + );
for(int i = ; i <= segNum; i++)
read(st[i]), read(ed[i]), read(d[i]); memset(f, 0xcf, sizeof(f));
f[][fx][fy] = ;
for(int i = ; i <= segNum; i++) {
for(int j = ; j <= n; j++)
for(int k = ; k <= m; k++)
if(mp[j][k] != 'x') chkMax(f[i][j][k], f[i - ][j][k]); // print(i); int len = ed[i] - st[i] + ;
if(d[i] == ) {
for(int k = ; k <= m; k++) {
int l = , r = ;
for(int j = n; j >= ; j--) {
for(; l <= r && q[l] > j + len; l++);
if(mp[j][k] == 'x') l = , r = ;
else if(l <= r) chkMax(f[i][j][k], f[i - ][q[l]][k] + (q[l] - j));
if(f[i - ][j][k] >= ) {
for(; l <= r && f[i - ][q[r]][k] + (q[r] - j) < f[i - ][j][k]; r--);
q[++r] = j;
}
}
}
} if(d[i] == ) {
for(int k = ; k <= m; k++) {
int l = , r = ;
for(int j = ; j <= n; j++) {
for(; l <= r && q[l] < j - len; l++);
if(mp[j][k] == 'x') l = , r = ;
else if(l <= r) chkMax(f[i][j][k], f[i - ][q[l]][k] + (j - q[l]));
if(f[i - ][j][k] >= ) {
for(; l <= r && f[i - ][q[r]][k] + (j - q[r]) < f[i - ][j][k]; r--);
q[++r] = j;
}
}
}
} if(d[i] == ) {
for(int j = ; j <= n; j++) {
int l = , r = ;
for(int k = m; k >= ; k--) {
for(; l <= r && q[l] > k + len; l++);
if(mp[j][k] == 'x') l = , r = ;
else if(l <= r) chkMax(f[i][j][k], f[i - ][j][q[l]] + (q[l] - k));
if(f[i - ][j][k] >= ) {
for(; l <= r && f[i - ][j][q[r]] + (q[r] - k) < f[i - ][j][k]; r--);
q[++r] = k;
}
}
}
} if(d[i] == ) {
for(int j = ; j <= n; j++) {
int l = , r = ;
for(int k = ; k <= m; k++) {
for(; l <= r && q[l] < k - len; l++);
if(mp[j][k] == 'x') l = , r = ;
else if(l <= r) chkMax(f[i][j][k], f[i - ][j][q[l]] + (k - q[l]));
if(f[i - ][j][k] >= ) {
for(; l <= r && f[i - ][j][q[r]] + (k - q[r]) < f[i - ][j][k]; r--);
q[++r] = k;
}
}
}
} // print(i);
} int ans = ;
for(int i = ; i <= n; i++)
for(int j = ; j <= m; j++)
chkMax(ans, f[segNum][i][j]);
printf("%d\n", ans); return ;
}
还是要仔细a
Luogu 2254 [NOI2005]瑰丽华尔兹的更多相关文章
- luogu P2254 [NOI2005]瑰丽华尔兹
题目链接 luogu P2254 [NOI2005]瑰丽华尔兹 题解 为什么我我我不放放放bzoj的链接呢? 因为打的暴力啊,然后bzojT了呀QAQQQQQ(逃 然后luogu竟然过了呀呀呀 dp[ ...
- 单调队列优化DP || [NOI2005]瑰丽华尔兹 || BZOJ 1499 || Luogu P2254
题外话:题目极好,做题体验极差 题面:[NOI2005]瑰丽华尔兹 题解: F[t][i][j]表示第t时刻钢琴位于(i,j)时的最大路程F[t][i][j]=max(F[t-1][i][j],F[t ...
- NOI2005瑰丽华尔兹
1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 893 Solved: 508[Submit][Status] ...
- bzoj1499[NOI2005]瑰丽华尔兹 单调队列优化dp
1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 1802 Solved: 1097[Submit][Status ...
- 【BZOJ1499】[NOI2005]瑰丽华尔兹 单调队列+DP
[BZOJ1499][NOI2005]瑰丽华尔兹 Description 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是 ...
- [Bzoj1499][NOI2005]瑰丽华尔兹[简单DP]
1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 1714 Solved: 1042[Submit][Status ...
- P2254 [NOI2005]瑰丽华尔兹
链接P2254 [NOI2005]瑰丽华尔兹 首先有个很朴素的\(dp\),设\(f_{i,j,k}\)表示\(k\)时刻地点\(i,j\)的最长长度. 然后这样不能优化,考虑利用一段连续时间是同一个 ...
- 题解-[NOI2005]瑰丽华尔兹
题解-[NOI2005]瑰丽华尔兹 [NOI2005]瑰丽华尔兹 \(n\times m\) 的矩阵.以 \((x,y)\) 为起点.一共 \(k\) 段时间,每段时间为 \([s_i,t_i](t_ ...
- BZOJ 1499 [NOI2005] 瑰丽华尔兹 | 单调队列优化DP
BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜 ...
随机推荐
- MKMapView缩放显示全部annotation(转)
原文 http://blog.csdn.net/favormm/article/details/8028026#define MINIMUM_ZOOM_ARC 0.014 //approximate ...
- 神秘常量!用0x077CB531计算末尾0的个数,32位数首位相连
大家或许还记得 Quake III 里面的一段有如天书般的代码,其中用到的神秘常量 0x5F3759DF 究竟是怎么一回事,着实让不少人伤透了脑筋.今天,我见到了一段同样诡异的代码. 下面这个 ...
- 使用bat文件实现批量重命名功能
在生活中我们总会碰到对大量文件进行重命名操作,这时如果一个一个的,选取文件→右键→重命名→选取文件,这样操作势必会浪费大量时间. 现在小编就告诉大家一个使用bat文件(命令行)的方法,快速对文件进行重 ...
- 一个Bug 差点让服务器的文件系统崩溃
昨天,公司的美国客户发邮件给我,说我的软件出问题了,我查来查去,发现居然是服务器上一个目录无法删除,一删除就报 cannot read from the source file or disk. 如果 ...
- 上传文件csv 导入功能
HTML代码: <script> function uploadCsv() { $('#chooseCsvFile').click(); } function doUploadCsv() ...
- UEditor富文本编辑器的图片上传 http://fex.baidu.com/ueditor/#server-deploy
http://fex.baidu.com/ueditor/#server-deploy http://fex.baidu.com/ueditor/#server-path 首先 editor配置文件中 ...
- java代码继承疑惑,请有心人解答
总结:这段程序没有问题,编译运行都是可以的.关键是,子类的无参构造方法第一句少了super(a,b);运行后,显示了双重结果 .还有.如果子类中没有声明成员变量String name.那么结果显示父 ...
- PostgreSQL 监控数据库活动
监控数据库活动 1. 标准Unix 工具 [root@mysqlhq ~]# ps auxww | grep ^postgrespostgres 12106 0.0 0.0 340060 15064 ...
- [phonegap]安装升级
安装 npm install -g phonegapnpm install -g phonegap@版本号 比如 npm install -g phonegap@3.3.0-0.19.6 升级 ...
- Python命令模块argparse学习笔记(一)
首先是关于-h/--help参数的设置 description:位于help信息前,可用于描述helpprog:描述help信息中程序的名称epilog:位于help信息后usage:描述程序的用途a ...