P3089 [USACO13NOV]POGO的牛Pogo-Cow

FJ给奶牛贝西的脚安装上了弹簧,使它可以在农场里快速地跳跃,但是它还没有学会如何降低速度。

FJ觉得让贝西在一条直线的一维线路上进行练习,他在不同的目标点放置了N (1 <= N <= 1000)个目标点,目标点i在目标点x(i),该点得分为p(i)。贝西开始时可以选择站在一个目标点上,只允许朝一个方向跳跃,从一目标点跳到另外一个目标点,每次跳跃的距离大于等于上一次跳跃的距离相等,并且必须跳到一个目标点。

每跳到一个目标点,贝西可以拿到该点的得分,请计算他的最大可能得分。

Solution

这题日了我好久啊

刚开始推了一下以为是单调队列

后面发现有个点(没打草稿脑算)推错了。。

设 \(dp[i][j]\) 为跳到第 \(i\) 个点, 从 \(j\) 点跳过来的最大价值

那么容易想到如下转移: $$dp[i][j] = \max_{dis(i, j) \geq dis(j, k)}dp[j][k] + v[i]$$

其复杂度为 \(O(n^{3})\), 难以接受

考虑优化, 能不能省掉某一维枚举

当然从可行性入手, 观察如下式子: $$dis(i, j) \geq dis(j, k)$$

对于一个特定的 \(j\) , 我们将其dp数组全部列出 $$dp[j][1], dp[j][2], dp[j][3],...,dp[j][j]$$

排除 \(i\) 的影响, 我们先把式子写成 \(dis(j, k) \leq t\) $$abs(p_{j} - p_{k}) \leq t$$

\(i, j\) 不变, 观察 \(k\) 对不等式成立的影响, 发现当 \(k\) 越小, 不等式越有可能成立

也就是说, 存在一个位置 \(x\) , 满足:$$abs(p_{j} - p_{x}) \leq t$$ $$abs(p_{j} - p_{x - 1}) > t$$

即 \([x, j]\) 范围内 \(dp[j][k]\) 全部可取, \([1, x - 1]\) 范围内 \(dp[j][k]\) 全部不可取

对于特定的 \(j\) , \(t\) 随着 \(i\) 的增大而增大, 所以 \(x\) 随 \(i\) 的增大而减小

于是对于每个 \(j\) 维护一个位置 \(x\), 记为 \(head[j]\) 表示其右端全部可取

同时维护可取的部分的最大值即可

Code

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<climits>
#define LL long long
#define REP(i, x, y) for(int i = (x);i <= (y);i++)
using namespace std;
int RD(){
int out = 0,flag = 1;char c = getchar();
while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
return flag * out;
}
const int maxn = 2019;
int num, ans;
struct Point{int p, v;}p[maxn];
int dp[maxn][maxn];//跳到i,从j跳过来的最大得分
bool cmp1(Point a, Point b){return a.p < b.p;}
bool cmp2(Point a, Point b){return a.p > b.p;}
void init(){
num = RD();
REP(i, 1, num)p[i] = (Point){RD(), RD()};
}
int head[maxn];//目前合法的第一个dp[i][x]位置
int maxx[maxn];//目前最大的关于i的上一项
void DP(){
memset(dp, 0, sizeof(dp));
REP(i, 1, num)dp[i][i] = maxx[i] = p[i].v, head[i] = i;//作为起点
REP(i, 1, num){
REP(j, 1, i - 1){
dp[i][j] = maxx[j] + p[i].v;
ans = max(ans, dp[i][j]);
}
REP(j, 1, i){
while(head[j] > 1 && (abs(p[i + 1].p - p[j].p) >= abs(p[j].p - p[head[j] - 1].p))){
head[j]--;
maxx[j] = max(maxx[j], dp[j][head[j]]);
}
}
}
}
void solve(){
sort(p + 1, p + 1 + num, cmp1);//顺着排序
DP();
sort(p + 1, p + 1 + num, cmp2);//倒着排序
DP();
printf("%d\n", ans);
}
int main(){
init();
solve();
return 0;
}

P3089 [USACO13NOV]POGO的牛Pogo-Cow的更多相关文章

  1. [luogu] P3089 [USACO13NOV]POGO的牛Pogo-Cow

    P3089 [USACO13NOV]POGO的牛Pogo-Cow 题目描述 In an ill-conceived attempt to enhance the mobility of his pri ...

  2. DP【洛谷P3089】 [USACO13NOV]POGO的牛Pogo-Cow

    [洛谷P3089] [USACO13NOV]POGO的牛Pogo-Cow FJ给奶牛贝西的脚安装上了弹簧,使它可以在农场里快速地跳跃,但是它还没有学会如何降低速度. FJ觉得让贝西在一条直线的一维线路 ...

  3. P2877 [USACO07JAN]牛校Cow School(01分数规划+决策单调性分治)

    P2877 [USACO07JAN]牛校Cow School 01分数规划是啥(转) 决策单调性分治,可以解决(不限于)一些你知道要用斜率优化却不会写的问题 怎么证明?可以暴力打表 我们用$ask(l ...

  4. bzoj1638 / P2883 [USACO07MAR]牛交通Cow Traffic

    P2883 [USACO07MAR]牛交通Cow Traffic 对于每一条边$(u,v)$ 设入度为0的点到$u$有$f[u]$种走法 点$n$到$v$(通过反向边)有$f2[v]$种走法 显然经过 ...

  5. P3014 [USACO11FEB]牛线Cow Line && 康托展开

    康托展开 康托展开为全排列到一个自然数的映射, 空间压缩效率很高. 简单来说, 康托展开就是一个全排列在所有此序列全排列字典序中的第 \(k\) 大, 这个 \(k\) 即是次全排列的康托展开. 康托 ...

  6. bzoj1612 / P2419 [USACO08JAN]牛大赛Cow Contest(Floyd)

    P2419 [USACO08JAN]牛大赛Cow Contest Floyd不仅可以算最短路,还可以处理点之间的关系. 跑一遍Floyd,处理出每个点之间是否有直接或间接的关系. 如果某个点和其他$n ...

  7. 【洛谷】2990:[USACO10OPEN]牛跳房子Cow Hopscotch【单调队列优化DP】

    P2990 [USACO10OPEN]牛跳房子Cow Hopscotch 题目描述 The cows have reverted to their childhood and are playing ...

  8. 洛谷——P2952 [USACO09OPEN]牛线Cow Line

    P2952 [USACO09OPEN]牛线Cow Line 题目描述 Farmer John's N cows (conveniently numbered 1..N) are forming a l ...

  9. P2419 [USACO08JAN]牛大赛Cow Contest

    P2419 [USACO08JAN]牛大赛Cow Contest 题目背景 [Usaco2008 Jan] 题目描述 N (1 ≤ N ≤ 100) cows, conveniently number ...

随机推荐

  1. [BZOJ4722]由乃[鸽巢原理+bitset+倍增]

    题意 给定长为 \(n\) 序列 \(a\) ,要求支持两种操作: \(1.\) 询问在一个区间 \([l,r]\) 中,是否能够选出两个交集为空的集合 $ \rm X ,Y$, 使得 \(\sum_ ...

  2. AngularJS 的异步服务测试与Mocking

    测试 AngularJS 的异步服务 最近,在做项目时掉进了 AngularJS 异步调用 $q 测试的坑中,直接躺枪了.折腾了许久日子,终于想通了其中的道道,但并不确定是最佳的解决方案,最后还是决定 ...

  3. Microsoft Dynamics CRM 增删改子表汇总子表的某个字段到主表的某个字段(通用插件)

    背景 经常有某个汇总子表的数量到主表的总数量,或者汇总子表的总价到主表的总价这种需求. 传统的做法: 1.就是为每个子表实体单独写成一个插件,但是这样不好复用. 2.主表的汇总字段是汇总货币类型,但是 ...

  4. SpringBoot日记——MQ消息队列整合(二)

    基于第一篇文章搭建好环境以后,我们这篇文章继续介绍如何在springboot中使用RabbitMQ. 1).单播:添加好pom文件和自定义配置后,来看: @Autowired RabbitTempla ...

  5. 在Windows上安装配置Git

    用安装 https://git-scm.com/ 官网下载安装包 (官网有安装步骤 https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-%E5%AE%8 ...

  6. POW的重力之美

    定律一:每一个UTXO都保持其状不变,直到有外力迫使它改变这种状态为止--艾萨克•牛顿,原理2.0 在过去的几年里,关于比特币的工作量证明(PoW)所造成的"巨大的能源浪费"已经被 ...

  7. Spring学习总结之装配bean

    1.  XML中显式配置 规范,文件头: <?xml version=”1.0” encoding=”UTF-8”?>            <beans xmlns=http:// ...

  8. 2-Twelfth Scrum Meeting20151212

    任务安排 成员 今日完成 明日任务 闫昊 获取视频播放的进度  获取视频播放进度 唐彬 解决handler可能引起的内存泄露问题  阅读IOS代码+阅读上届网络核心代码 史烨轩 下载service开发 ...

  9. Day Three

    站立式会议 站立式会议内容总结 442 今天:从本地导入电子书页面编写以及部分逻辑代码 遇到的问题:界面适配问题 明天:具体计划界面的编写,解决上面问题 331 今天:监听webview滑动底端事件 ...

  10. 2017全球GDP总量达74万亿美元 各国占比排行榜

    全球GDP总量达74万亿美元 各国占比排行榜     2017年公布的2015年全球各国GDP占比,数据图片来源:世界银行报告 2月24日,来自世界银行的最新GDP数字已于2月早些时候公布,现由How ...