BZOJ2037: [Sdoi2008]Sue的小球(区间DP)
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 869 Solved: 483
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
-4 -2 2
22 30 26
1 9 8
Sample Output
数据范围:
N < = 1000,对于100%的数据。 -10^4 < = xi,yi,vi < = 10^4
HINT
Source
很不错的一道题目
如果我们按正常的DP思路去做的话,不管怎样都需要把时间加到状态里面。
但是这样肯定TLE + MLE
我们考虑消除时间这一维,通过观察不难发现,Sandy走过的路线一定是一段连续的区间,
因此我们考虑用$f[i][j]$表示这一段区间都被选的最大答案
但是这样我们无法表示它当前的位置,
稍加观察不难发现,Sandy拿完这一段区间,一定是在左/右端点,我们把位置加入到状态里面
用$f[i][j][0/1]$分别表示拿了$[i,j]$这段区间后在左边/右边的最大答案
那么转移的时候只需要考虑从哪里转移而来就可以了,
每走一步的损失可以通过前缀和做到$O(1)$查询
#include<cstdio>
#include<algorithm>
#include<cstring>
const int MAXN = ;
inline int read() {
char c = getchar(); int x = , f = ;
while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * f;
}
int N, X0;
struct Node {
double x, y, v;
bool operator < (const Node &rhs) const{
return x < rhs.x;
}
}a[MAXN];
double sum[MAXN], w[MAXN][MAXN], f[][MAXN][MAXN];
double dis(int x, int y) {
return a[y].x - a[x].x;
}
double Query(int x, int y) {
if(x < ) return sum[N] - sum[y];
return sum[N] - sum[y] + sum[x];
}
int main() {
#ifdef WIN32
freopen("a.in", "r", stdin);
#endif
N = read();
a[] = (Node) {X0 = read(), , };
for(int i = ;i <= N; i++) a[i].x = read();
for(int i = ; i <= N; i++) a[i].y = read();
for(int i = ; i <= N; i++) a[i].v = read(); std::sort(a, a + N + ); sum[] = a[].v;
for(int i = ; i <= N; i++) sum[i] = sum[i - ] + a[i].v; memset(f, -0x3f, sizeof(f));
for(int i = ; i <= N; i++)
if(a[i].x == X0)
f[][i][i] = f[][i][i] = ; for(int len = ; len <= N; len++) {
for(int i = ; i + len <= N; i++) {
int j = i + len;
f[][i][j] = std::max(f[][i + ][j] + a[i].y - dis(i, i + ) * Query(i, j),
f[][i + ][j] + a[i].y - dis(i, j) * Query(i, j));
f[][i][j] = std::max(f[][i][j - ] + a[j].y - dis(i, j) * Query(i - , j - ),
f[][i][j - ] + a[j].y - dis(j - , j) * Query(i - , j - ));
// printf("%.3lf %.3lf\n", f[0][i][j], f[1][i][j]);
}
}
printf("%.3lf", std::max(f[][][N], f[][][N]) / );
return ;
}
BZOJ2037: [Sdoi2008]Sue的小球(区间DP)的更多相关文章
- 【BZOJ2037】[Sdoi2008]Sue的小球 区间DP+费用提前
[BZOJ2037][Sdoi2008]Sue的小球 Description Sue和Sandy最近迷上了一个电脑游戏,这个游戏的故事发在美丽神秘并且充满刺激的大海上,Sue有一支轻便小巧的小船.然而 ...
- [luogu2446][bzoj2037][SDOI2008]Sue的小球【区间DP】
分析 简单区间DP, 定义状态f[i][j][0/1]为取完i-j的小球最后取i/j上的小球所能获得的最大价值. 排序转移. ac代码 #include <bits/stdc++.h> # ...
- BZOJ2037: [Sdoi2008]Sue的小球
Description Sue 和Sandy最近迷上了一个电脑游戏,这个游戏的故事发在美丽神秘并且充满刺激的大海上,Sue有一支轻便小巧的小船.然而,Sue的目标并不是当一个海 盗,而是要收集空中漂浮 ...
- 2037: [Sdoi2008]Sue的小球
2037: [Sdoi2008]Sue的小球 链接 题解 论文 代码 #include<cstdio> #include<algorithm> #include<cstr ...
- 【BZOJ2037】Sue的小球(动态规划)
[BZOJ2037]Sue的小球(动态规划) 题面 BZOJ 题解 莫名想到这道题目 很明显是一样的 设\(f[i][j][0/1]\)表示已经接到了\(i-j\)这一段的小球 当前在\(i\)或者在 ...
- [SDOI2008]Sue的小球
题目描述 Sue和Sandy最近迷上了一个电脑游戏,这个游戏的故事发在美丽神秘并且充满刺激的大海上,Sue有一支轻便小巧的小船.然而,Sue的目标并不是当一个海盗,而是要收集空中漂浮的彩蛋,Sue有一 ...
- Luogu[SDOI2008]Sue的小球
题目描述 Sue和Sandy最近迷上了一个电脑游戏,这个游戏的故事发在美丽神秘并且充满刺激的大海上,Sue有一支轻便小巧的小船.然而,Sue的目标并不是当一个海盗,而是要收集空中漂浮的彩蛋,Sue有一 ...
- 【简●解】[SDOI2008] Sue的小球
[简●解][SDOI2008] Sue的小球 计划着刷\(DP\)题结果碰到了这样一道论文题,幸好不是太难. [题目大意] 口水话有点多,所以就直接放链接.传送门 [分析] 看到题首先联想到了曾经做过 ...
- bzoj 2037: [Sdoi2008]Sue的小球——dp
Description Sue和Sandy最近迷上了一个电脑游戏,这个游戏的故事发在美丽神秘并且充满刺激的大海上,Sue有一支轻便小巧的小船.然而,Sue的目标并不是当一个海盗,而是要收集空中漂浮的彩 ...
随机推荐
- JSON中的安全问题
Web中使用JSON时最常见的两个安全问题: 1.跨站请求伪造: 即CSRF,是一种利用站点对用户浏览器信任发起攻击的方式.典型的就是JSON数组,更多信息请自行上网百度. 2.跨站脚本攻击. 是注入 ...
- idea output 消失找不到
今天一不小心把idea的 debug的控制台output 搞丢了, 半天找不到,原来是在这里隐藏着 Restore layout
- 【PHP系列】框架的抉择
缘起 在PHP开发中,选择合适的框架有助于加快软件开发,节约宝贵的项目时间,让开发者专注于功能的实现上.框架的问题是需要很多的投入,选择框架时,我们更看重这个框架的未来,存在多年的大型框架必须要有好的 ...
- SQL Server ->> 高可用与灾难恢复(HADR)技术 -- AlwaysOn(实战篇)之AlwaysOn可用性组搭建
因为篇幅原因,AlwaysOn可用性组被拆成了两部分:理论部分和实战部分.而实战部分又被拆成了准备工作和AlwaysOn可用性组搭建. 三篇文章各自的链接: SQL Server ->> ...
- 树的各种操作java
package mystudy; import java.io.UnsupportedEncodingException; import java.util.LinkedList; import ja ...
- SQL Server 使用 OUTPUT做数据操作记录
OUTPUT 子句 可以在数据进行增删改的时候,可以返回受影响的行.先准备一张表 create table #t ( id int identity primary key ,name ) ) go ...
- 使用UIScreenEdgePanGestureRecognizer写iOS7侧边栏
使用UIScreenEdgePanGestureRecognizer写iOS7侧边栏 A UIScreenEdgePanGestureRecognizer looks for panning (dra ...
- WIN7与WIN10 安装
---恢复内容开始--- 开始的操作系统是黑白屏的DOS,随着光标的一闪一闪并逐渐后移,一条条指令输入电脑,并执行相关指令完成任务.慢慢的,视窗操作系统最初是基于DOS的windows 9X内核WIN ...
- linux普通用户使用root权限执行命令的脚本
上一篇有说到普通用户使用免密登录并使用root权限: http://www.cnblogs.com/01-single/p/8919254.html 现在使用脚本批量实现部署系统任务操作步骤: #!/ ...
- 【深入理解JAVA虚拟机】第二部分.内存自动管理机制.4.JVM工具
1.概述 工具作用:性能监控与故障处理 工作原理:分析数据 数据包含:运行日志. 异常堆栈. GC日志. 线程快照(threaddump/javacore文件). 堆转储快照(heapdump/hpr ...