【简●解】[SDOI2008] Sue的小球
计划着刷\(DP\)题结果碰到了这样一道论文题,幸好不是太难。
【题目大意】
口水话有点多,所以就直接放链接。传送门
【分析】
看到题首先联想到了曾经做过的关路灯。所以先按\(x\)值排序,然后进行区间\(DP\)。
不妨设\(f_1[i][j]\),\(f_2[i][j]\)分别表示从起点出发已射落\(i\)到\(j\)这一段彩蛋,当前停留在\(i\)点,\(j\)点的最大得分\(v\)。
考虑 \(f_1[i][j]\),即点\(i\)是当前射击的彩蛋,射击的得分与当前时刻挂钩,但 是当前的时刻是不能从\(f_1[i][j]\)的状态中表示出来的,我们进一步考虑 \(f_1[i][j]\)的求解。
由于射击\(i\)的得分是\(y_i−t∗v_i\),而\(t\)等于之前每一步决策移动的时间总和,这样我们就可以把\(t∗v_i\)在之前的移动中就计算,也就是说每次移动都要把未来会减少的得分计算在内。 比如说从\(f_1[i+1][j]\)推到\(f_1[i][j]\),即从\(i+1\)走到\(i\)时除了\(i+1\)到\(j\)这一段彩蛋外,其它的彩蛋都在下落,将这丢失的分数一并计算到从\(i+1\)走到\(i\)中。由于\(-t*v_i\)已经在之前决策时计算,所以射击时直接加上\(y_i\)即可。
所以可以先用\(sum[]\)计算\(v_i\)的前缀和,然后\(DP\)方程:
\]
\]
然后\(O(n^2)\)过。
【Code】
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define ll long long
using namespace std;
const int MAX = 1000 + 5;
const int INF = 0x3f3f3f3f;
inline int read(){
int f = 1, x = 0;char ch;
do { ch = getchar(); if (ch == '-') f = -1; } while (ch < '0'||ch>'9');
do {x = x*10+ch-'0'; ch = getchar(); } while (ch >= '0' && ch <= '9');
return f*x;
}
int n, bj;
double x0, f[3][MAX][MAX], sum[MAX];
struct sakura { double x, y, v; }sak[MAX];
inline bool cmp(sakura a, sakura b) { return a.x < b.x; }
inline double Sum(int l, int r) { return sum[n] - sum[r] + sum[l - 1]; }
inline double ab(double a) { return a < 0 ? -a : a; }
int main(){
n = read(); ++n, x0 = read();
sak[1].x = x0, sak[1].y = sak[1].v = 0;
for (int i = 2;i <= n; ++i) {
sak[i].x = read();
}
for (int i = 2;i <= n; ++i) {
sak[i].y = read();
}
for (int i = 2;i <= n; ++i) {
sak[i].v = read();
}
sort(sak + 1, sak + 1 + n, cmp);
for (int i = 1;i <= n; ++i) {
sum[i] = sum[i - 1] + sak[i].v;
if (ab(sak[i].x - x0) <= 1e-10 && ab(sak[i].y) <= 1e-10) {
bj = i;
}
}
memset(f, -INF, sizeof (f));
f[1][bj][bj] = f[2][bj][bj] = 0.0;
for (int k = 1;k <= n; ++k) {
for (int i = 1;i + k <= n; ++i) {
int j = i + k;
f[1][i][j] = sak[i].y + max(f[1][i + 1][j] - (sak[i + 1].x - sak[i].x) * Sum(i + 1, j), f[2][i + 1][j] - (sak[j].x - sak[i].x) * Sum(i + 1, j));
f[2][i][j] = sak[j].y + max(f[1][i][j - 1] - (sak[j].x - sak[i].x) * Sum(i, j - 1), f[2][i][j -1] - (sak[j].x - sak[j - 1].x) * Sum(i, j - 1));
}
}
printf("%.3lf", max(f[1][1][n], f[2][1][n]) / 1000.0);
return 0;
}
后来听人说这是未来\(DP\)???
【简●解】[SDOI2008] Sue的小球的更多相关文章
- 【BZOJ2037】[Sdoi2008]Sue的小球 区间DP+费用提前
[BZOJ2037][Sdoi2008]Sue的小球 Description Sue和Sandy最近迷上了一个电脑游戏,这个游戏的故事发在美丽神秘并且充满刺激的大海上,Sue有一支轻便小巧的小船.然而 ...
- 2037: [Sdoi2008]Sue的小球
2037: [Sdoi2008]Sue的小球 链接 题解 论文 代码 #include<cstdio> #include<algorithm> #include<cstr ...
- BZOJ2037: [Sdoi2008]Sue的小球
Description Sue 和Sandy最近迷上了一个电脑游戏,这个游戏的故事发在美丽神秘并且充满刺激的大海上,Sue有一支轻便小巧的小船.然而,Sue的目标并不是当一个海 盗,而是要收集空中漂浮 ...
- [SDOI2008]Sue的小球
题目描述 Sue和Sandy最近迷上了一个电脑游戏,这个游戏的故事发在美丽神秘并且充满刺激的大海上,Sue有一支轻便小巧的小船.然而,Sue的目标并不是当一个海盗,而是要收集空中漂浮的彩蛋,Sue有一 ...
- [luogu2446][bzoj2037][SDOI2008]Sue的小球【区间DP】
分析 简单区间DP, 定义状态f[i][j][0/1]为取完i-j的小球最后取i/j上的小球所能获得的最大价值. 排序转移. ac代码 #include <bits/stdc++.h> # ...
- BZOJ2037: [Sdoi2008]Sue的小球(区间DP)
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 869 Solved: 483[Submit][Status][Discuss] Description ...
- bzoj 2037: [Sdoi2008]Sue的小球——dp
Description Sue和Sandy最近迷上了一个电脑游戏,这个游戏的故事发在美丽神秘并且充满刺激的大海上,Sue有一支轻便小巧的小船.然而,Sue的目标并不是当一个海盗,而是要收集空中漂浮的彩 ...
- Luogu[SDOI2008]Sue的小球
题目描述 Sue和Sandy最近迷上了一个电脑游戏,这个游戏的故事发在美丽神秘并且充满刺激的大海上,Sue有一支轻便小巧的小船.然而,Sue的目标并不是当一个海盗,而是要收集空中漂浮的彩蛋,Sue有一 ...
- bzoj 2037: [Sdoi2008]Sue的小球
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; struc ...
随机推荐
- POJ1017 【据说是贪心...】
题意: 有6种面积的格子,给出这些格子的数量,然后有6*6的格子去容纳这6种面基,问最少需要几个6*6格子,使得所有类型的小格子被容纳. 思路: 按照面积的从大到小放. 一开始还是太天真,还要用各种1 ...
- python __builtins__ str类 (65)
65.'str', 字节转换成字符串.第一个传入参数是要转换的字节,第二个参数是按什么编码转换成字符串 class str(object) | str(object='') -> str | s ...
- 51单片机 HC05蓝牙模块
一.注意事项 1.烧写程序时,要把蓝牙tx,rx信号线拔掉,对烧写程序有影响. 2.执行HC05集命令时,均以\r\n结尾.串口中断若选择“发送新行”时,不用添加\r\n.原理相同. 二.准备软硬件 ...
- 关于asp.net网址出现乱码问题的解决方法
背景: asp.net项目,C#,VS2010,.netframework 4.0 创建之初,没有任何问题,随着项目文件的增多,不免很多问题会出现, 最近就莫名其妙的发现我的项目网址多了一段乱码,很是 ...
- Hue的全局配置文件hue.ini(图文详解)
Hue版本:hue-3.9.0-cdh5.5.4 需要编译才能使用(联网) 说给大家的话:大家电脑的配置好的话,一定要安装cloudera manager.毕竟是一家人的.同时,我也亲身经历过,会有部 ...
- Educational Codeforces Round 20 B
Description You are given the array of integer numbers a0, a1, ..., an - 1. For each element find th ...
- Plugging an Unplugged Pluggable Database issue 2
因为原库和目标库版本不一制,出现各种问题,强烈建议保持2个版本一致 http://www.cndba.cn/dave/article/220 Log 提示查看PDB_PLUG_IN_VIOLATION ...
- 145 Binary Tree Postorder Traversal 二叉树的后序遍历
给定一棵二叉树,返回其节点值的后序遍历.例如:给定二叉树 [1,null,2,3], 1 \ 2 / 3返回 [3,2,1].注意: 递归方法很简单,你可以使用迭代方法来解 ...
- Ionic之ui-sref引入图片,图片部分挡住解决方案
ionic图片设置大小跟图片像素相同,但是使用ui-sref="parkInfo"上半部分图片会挡住,增加height的高度,就可以显示原本图片 页面: <ion-conte ...
- Oracle、MySQL和SqlServe分页查询的语句区别
★先来定义分页语句将要用到的几个参数: int currentPage ; //当前页 int pageRecord ; //每页显示记录数 以之前的ADDRESSBOOK数据表为例(每页显示10条记 ...