bzoj2037 Sue的小球(区间dp,考虑到对未来的贡献)
大致意思就是现在你要不断的奔跑到不同的地点去接球,每一秒可以移动一个单位长度,而你接到一个球的动作是瞬间的,收益是y[i]-t*v[i] 然后呢,要求分数最高。
起初看这个题目QWQ完全没有任何思路,大概只能想到......
先按照x排序(记得把起始位置也加进去)
然后令f[l][r]表示收集完l~r的球,最后在l的最大收益
g[l][r]收集完l~r的球,最后在r的最大收益
然后...然后....然后....
我就去看题解了。
好了 进入正题。
首先我们定义
f[l][r]表示收集完l~r的球,最后在l的最小损失
g[l][r]收集完l~r的球,最后在r的最小损失
最后用总收益减去损失
在按照x排完序之后
进行区间dp,由小区间转到大区间
f[l][r]可以从f[l+1][r]和g[l+1][r]转移而来
g[l][r]可以从f[l][r-1]和g[l][r-1]转移而来
我们可以这么理解
每当我们去接下一个球的时候,其他球在向下掉,相当于我们损失了这些的收益
那么时间就是x之差的绝对值,然后提前用前缀和预处理v
就可以直接算出损失了多少收益了
f[l][r]=min(f[l][r],f[l+1][r]+(sum[n]-sum[r]+sum[l])abs(a[l+1].x-a[l].x));
f[l][r]=min(f[l][r],g[l+1][r]+(sum[n]-sum[r]+sum[l])abs(a[r].x-a[l].x));
g[l][r]=min(g[l][r],f[l][r-1]+(sum[n]-sum[r-1]+sum[l-1])*abs(a[l].x-a[r].x));
g[l][r]=min(g[l][r],g[l][r-1]+(sum[n]-sum[r-1]+sum[l-1])*abs(a[r-1].x-a[r].x));
转移式子就不过多解释了
然后最后用ans-min(f[1][n],g[1][n])再 /1000就行
最后注意初始化的时候 嗯
QWQ我的写法和很多题解都不一样 不过也过了QWQ不太知道是为什么
for (int i=1;i<=n;i++) f[i][i]=abs(a[i].x-start)sum[n],g[i][i]=abs(a[i].x-start)sum[n];
上代码 嗯
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)) {if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
const int maxn = 1010;
struct Node{
int v,x,y;
};
Node a[maxn];
int f[maxn][maxn]; //i~j接完 最后在i
int g[maxn][maxn]; // i~j接完,最后在j
int sum[maxn];
int start,n;
double ans;
bool cmp(Node a,Node b)
{
return a.x<b.x;
}
int main()
{
n=read();
start=read();
memset(f,127/3,sizeof(f));
memset(g,127/3,sizeof(g));
for (int i=1;i<=n;i++) a[i].x=read();
for (int i=1;i<=n;i++) a[i].y=read(),ans+=a[i].y;
for (int i=1;i<=n;i++) a[i].v=read();
n++;
a[n].x=start;
sort(a+1,a+1+n,cmp);
for (int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i].v;
for (int i=1;i<=n;i++) f[i][i]=abs(a[i].x-start)*sum[n],g[i][i]=abs(a[i].x-start)*sum[n];
for (int i=2;i<=n;i++)
for (int l=1;l<=n-i+1;l++)
{
int r = l+i-1;
f[l][r]=min(f[l][r],f[l+1][r]+(sum[n]-sum[r]+sum[l])*abs(a[l+1].x-a[l].x));
f[l][r]=min(f[l][r],g[l+1][r]+(sum[n]-sum[r]+sum[l])*abs(a[r].x-a[l].x));
g[l][r]=min(g[l][r],f[l][r-1]+(sum[n]-sum[r-1]+sum[l-1])*abs(a[l].x-a[r].x));
g[l][r]=min(g[l][r],g[l][r-1]+(sum[n]-sum[r-1]+sum[l-1])*abs(a[r-1].x-a[r].x));
}
ans=ans-min((double)f[1][n],(double)g[1][n]);
printf("%.3lf",ans/1000);
return 0;
}
bzoj2037 Sue的小球(区间dp,考虑到对未来的贡献)的更多相关文章
- 【BZOJ2037】[Sdoi2008]Sue的小球 区间DP+费用提前
[BZOJ2037][Sdoi2008]Sue的小球 Description Sue和Sandy最近迷上了一个电脑游戏,这个游戏的故事发在美丽神秘并且充满刺激的大海上,Sue有一支轻便小巧的小船.然而 ...
- BZOJ2037: [Sdoi2008]Sue的小球(区间DP)
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 869 Solved: 483[Submit][Status][Discuss] Description ...
- BZOJ-2037 Sue的小球 DP+费用提前
似乎很早时学长考过很类似的? 2037: [Sdoi2008]Sue的小球 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 558 Solved: 300 ...
- [luogu2446][bzoj2037][SDOI2008]Sue的小球【区间DP】
分析 简单区间DP, 定义状态f[i][j][0/1]为取完i-j的小球最后取i/j上的小球所能获得的最大价值. 排序转移. ac代码 #include <bits/stdc++.h> # ...
- 【BZOJ2037】Sue的小球(动态规划)
[BZOJ2037]Sue的小球(动态规划) 题面 BZOJ 题解 莫名想到这道题目 很明显是一样的 设\(f[i][j][0/1]\)表示已经接到了\(i-j\)这一段的小球 当前在\(i\)或者在 ...
- 区间DP复习
区间DP复习 (难度排序:(A,B),(F,G,E,D,H,I,K),(C),(J,L)) 这是一个基本全在bzoj上的复习专题 没有什么可以说的,都是一些基本的dp思想 A [BZOJ1996] [ ...
- 洛谷 P2466 Sue的小球 解题报告
P2466 [SDOI2008]Sue的小球 题目描述 Sue和Sandy最近迷上了一个电脑游戏,这个游戏的故事发在美丽神秘并且充满刺激的大海上,Sue有一支轻便小巧的小船.然而,Sue的目标并不是当 ...
- 2037: [Sdoi2008]Sue的小球
2037: [Sdoi2008]Sue的小球 链接 题解 论文 代码 #include<cstdio> #include<algorithm> #include<cstr ...
- [USACO2005 nov] Grazing on the Run【区间Dp】
Online Judge:bzoj1742,bzoj1694 Label:区间Dp 题目描述 John养了一只叫Joseph的奶牛.一次她去放牛,来到一个非常长的一片地,上面有N块地方长了茂盛的草.我 ...
随机推荐
- http请求包含哪几个部分(请求行、请求头、请求体)
http协议报文 1.请求报文(请求行/请求头/请求数据/空行) 请求行 求方法字段.URL字段和HTTP协议版本 例如:GET ...
- Qt之文件操作
虽然文件操作是一项很常用的功能,但是总记不住,今天就干脆记了一下笔记,以后好查阅. 在Qt中,主要使用的是QFile类进行文件操作,因此要包括#include <QFile>头文件.下面就 ...
- K8S的核心概念
1.Pod -- 是最小部署单元 -- 是一组容器的集合 -- Pod中的容器共享网络 -- 生命周期是短暂的 2.controller -- 确保预期的pod副本的数量 -- 确保所有的node运行 ...
- 性能测试必备命令(2)- uptime
性能测试必备的 Linux 命令系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1819490.html 介绍 系统启动up了(运行了)多 ...
- 硕盟SM-T54| TYPE C转HDMI+VGA+USB3.0+PD3.0四合一多功能扩展坞
硕盟SM-T54是一款 TYPE C转HDMI+VGA+USB3.0+PD3.0四合一多功能扩展坞,支持四口同时使用,您可以将含有USB 3.1协议的电脑主机,通过此产品连接到具有HDMI或VGA的显 ...
- 管理后台界面 详细分析(内含代码 |【前端】)RuoYi
最近在做的一个后台管理 因为关于隐私原因 只方便展示个别页面代码 不会上传项目 注意是前端代码 我把项目代码地址放在最后了 如有需要可自取学习 我会为各位兄弟详细的介绍其中各个属性的含义和用法,记 ...
- Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Consul服务注册,服务发现
环境 .NET5,Consul_v1.10.2 一.简介 在微服务中利用Consul可以实现服务的注册,服务发现,治理,健康检查等. Web调站点需要调用多个服务,如果没有Consul,可能就是Web ...
- phpstrom 在smarty 中tpl模版注释怎么修改?
{*<div class="col-sm-10">*} phpstorm注释tpl文件代码为上面,但是这个不符合本框架的注释方式,会报错,需要调整为: <!-- ...
- webpack learn2-vue的jsx写法和postcss 1
首先输入命令安装 npm i postcss-loader autoprefixer babel-loader babel-core 在根目录创建文件 .babelrc和postcss.config. ...
- Java面向对象系列(3)- 回顾方法的调用
方法的调用 静态方法 非静态方法 形参和实参 值传递和引用传递 this关键字(继承篇讲解) 静态方法 非静态方法 形参和实参 package oop.demo01; public class Dem ...