​​​​​​​​​​​​​​大致意思就是现在你要不断的奔跑到不同的地点去接球,每一秒可以移动一个单位长度,而你接到一个球的动作是瞬间的,收益是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;
}

转载于:https://www.cnblogs.com/yimmortal/p/10160606.html

bzoj2037 Sue的小球(区间dp,考虑到对未来的贡献)相关推荐

  1. [SDOI2008]SUE的小球

    [SDOI2008]SUE的小球 文章目录 题目描述 题解: 代码: 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Form ...

  2. POJ 2955 Brackets (区间DP)

    题目链接:http://poj.org/problem?id=2955 Brackets Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  3. 0x53. 动态规划 - 区间DP(习题详解 × 8)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 文章目录 0x53. 动态规划 - 区间DP Problem A. 最优矩阵链乘 Problem B. ...

  4. UVA1626 括号序列 Brackets sequence(区间DP匹配括号,输出匹配方案)

    整理的算法模板合集: ACM模板 UVA1626 Brackets sequence 我们将正规括号序列定义如下: 空序列是正规括号序列. 如果 SSS 是一个正规括号序列,那么 (S) 和 [S] ...

  5. UVA10003 切木棍 Cutting Sticks(区间DP、细节)

    整理的算法模板合集: ACM模板 本题其实就是一个区间DP 的模板题,总长度为len,有n个切割点,也就是说能被切割成n+1段,所以左边界是0,有边界是n + 1,所以答案就是f[0][n + 1]. ...

  6. 【动态规划】区间DP - 最优矩阵链乘(另附POJ1651Multiplication Puzzle)

    最优矩阵链乘(动态规划) 一个n∗mn*mn∗m的矩阵由 nnn 行 mmm 列共 n∗mn*mn∗m 排列而成.两个矩阵A和B可以相乘当且仅当A的列数等于B的行数.一个nm的矩阵乘mp的矩阵,运算量 ...

  7. 【每日DP】day13、P3147 [USACO16OPEN]262144 (区间DP,2048游戏)难度⭐⭐⭐★

    P3147 [USACO16OPEN]262144 P 想到合并,自然就想到区间dp,一个被合成的数之前是一个区间,并且由两个数比它小 111 的区间合成.可麻烦的是,我们并不知道之前的两个区间长度各 ...

  8. poj1651(区间dp)

    题目连接:http://poj.org/problem?id=1651 题意:给出一组N个数,每次从中抽出一个数(第一和最后一个不能抽),该次的得分即为抽出的数与相邻两个数的乘积.直到只剩下首尾两个数 ...

  9. HDU 5115 Dire Wolf ——(区间DP)

    比赛的时候以为很难,其实就是一个区间DP= =..思路见:点我. 区间DP一定要记住先枚举区间长度啊= =~!因为区间dp都是由短的区间更新长的区间的,所以先把短的区间更新完.. 代码如下: 1 #i ...

  10. 编程之美2015资格赛 题目2 : 回文字符序列 [ 区间dp ]

    传送门 题目2 : 回文字符序列 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定字符串,求它的回文子序列个数.回文子序列反转字符顺序后仍然与原序列相同.例如字符串ab ...

最新文章

  1. 局域网通讯工具_自动称重带无线通讯WIFI传输功能设备
  2. DISK 100% BUSY,谁造成的?(ok)
  3. 在51aspx收集的农历日期类
  4. Linux程序开机启动
  5. 动态创建表格给同一个标签创建点击事件并让点击事件操作内容不一样
  6. ASP.NET----验证码类
  7. vivado在远程服务器上完成本地设备的程序烧写和调试(vivado远程调试)
  8. BETA、RC、ALPHA、Release、GA 等版本号的意义
  9. java 强制向上转型,Java 转型(向上或向下转型)详解及简单实例
  10. 基于Spring Security的认证方式_Spring Security 的认证流程_Spring Security OAuth2.0认证授权---springcloud工作笔记123
  11. AngularJS JetBrains WebStorm简介
  12. 拓端tecdat|R语言文本挖掘tf-idf,主题建模,情感分析,n-gram建模研究
  13. Fortran入门教程(五)——选择结构
  14. xp系统从u盘启动计算机,手把手教你u盘安装XP系统步骤
  15. H3C Comware V7新增的RBAC
  16. 肿瘤基因检测的解读流程
  17. 什么是阿里云aca认证,阿里云aca认证有用吗
  18. 老照片:一个澳洲人在大清国的徒步旅行
  19. S@Kura的PHP进阶之路(五)
  20. 【向生活低头】wps行间距问题

热门文章

  1. 【学习笔记】seckill-秒杀项目--(9)接口优化
  2. 硕士毕业论文页眉页脚页码设置
  3. 以太坊的区块和存储(二):区块体之叔区块
  4. 最大公因数、最小公倍数求法(C++)
  5. 微信公众平台-微信服务号开发
  6. 笔记本电脑蓝屏代码stop:0x0000007b(0xb84d3524,0xc0000034,0x00000000,0x00000000)
  7. raid0 trim linux,6系主板泪流满面,终于支持RAID 0模式下的TRIM了
  8. ES设置用户名和密码
  9. 机械制造技术类毕业论文文献都有哪些?
  10. java 加密 —— 对称加密、非对称加密、消息摘要