P3089 [USACO13NOV]POGO的牛Pogo-Cow
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的更多相关文章
- [luogu] P3089 [USACO13NOV]POGO的牛Pogo-Cow
P3089 [USACO13NOV]POGO的牛Pogo-Cow 题目描述 In an ill-conceived attempt to enhance the mobility of his pri ...
- DP【洛谷P3089】 [USACO13NOV]POGO的牛Pogo-Cow
[洛谷P3089] [USACO13NOV]POGO的牛Pogo-Cow FJ给奶牛贝西的脚安装上了弹簧,使它可以在农场里快速地跳跃,但是它还没有学会如何降低速度. FJ觉得让贝西在一条直线的一维线路 ...
- P2877 [USACO07JAN]牛校Cow School(01分数规划+决策单调性分治)
P2877 [USACO07JAN]牛校Cow School 01分数规划是啥(转) 决策单调性分治,可以解决(不限于)一些你知道要用斜率优化却不会写的问题 怎么证明?可以暴力打表 我们用$ask(l ...
- bzoj1638 / P2883 [USACO07MAR]牛交通Cow Traffic
P2883 [USACO07MAR]牛交通Cow Traffic 对于每一条边$(u,v)$ 设入度为0的点到$u$有$f[u]$种走法 点$n$到$v$(通过反向边)有$f2[v]$种走法 显然经过 ...
- P3014 [USACO11FEB]牛线Cow Line && 康托展开
康托展开 康托展开为全排列到一个自然数的映射, 空间压缩效率很高. 简单来说, 康托展开就是一个全排列在所有此序列全排列字典序中的第 \(k\) 大, 这个 \(k\) 即是次全排列的康托展开. 康托 ...
- bzoj1612 / P2419 [USACO08JAN]牛大赛Cow Contest(Floyd)
P2419 [USACO08JAN]牛大赛Cow Contest Floyd不仅可以算最短路,还可以处理点之间的关系. 跑一遍Floyd,处理出每个点之间是否有直接或间接的关系. 如果某个点和其他$n ...
- 【洛谷】2990:[USACO10OPEN]牛跳房子Cow Hopscotch【单调队列优化DP】
P2990 [USACO10OPEN]牛跳房子Cow Hopscotch 题目描述 The cows have reverted to their childhood and are playing ...
- 洛谷——P2952 [USACO09OPEN]牛线Cow Line
P2952 [USACO09OPEN]牛线Cow Line 题目描述 Farmer John's N cows (conveniently numbered 1..N) are forming a l ...
- P2419 [USACO08JAN]牛大赛Cow Contest
P2419 [USACO08JAN]牛大赛Cow Contest 题目背景 [Usaco2008 Jan] 题目描述 N (1 ≤ N ≤ 100) cows, conveniently number ...
随机推荐
- Java 多线程之 Thread 类 和 Runnable 接口初步使用
目录 Thread 类 Thread之定义线程类 Thread之开启线程 Runnable 接口 Runnable 之定义线程类 Runnable 之开启线程 @ Thread 类 Thread 类是 ...
- node.js学习笔记(四)——EventEmitter
error 事件 EventEmitter 定义了一个特殊的事件 error,它包含了错误的语义,我们在遇到异常的时候通常会触发 error 事件.当 error 被触发时,EventEmitter ...
- 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context}Setting property 'source' to 'org.eclipse
当你用Eclipse运行web项目的时候,你就会看到控制台出现:WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Set ...
- FINAUNCE金融业增速反弹信贷投放创新高叠加股市回暖
FINAUNCE金融业增速反弹信贷投放创新高叠加股市回暖,金融业增加值增速回暖,不过难以回到2015年的巅峰. 国家统计局4月18日发布的数据显示,今年一季度,国内生产总值21.34万亿元,按可比价格 ...
- pycharm常用的一些快捷键
1.编辑(Editing) Ctrl + Space 基本的代码完成(类.方法.属性)Ctrl + Alt + Space 快速导入任意类Ctrl + Shift + Enter 语句完成Ctrl + ...
- idou老师教你学Istio :如何用istio实现监控和日志采集
大家都知道istio可以帮助我们实现灰度发布.流量监控.流量治理等功能.每一个功能都帮助我们在不同场景中实现不同的业务.那Istio是如何帮助我们实现监控和日志采集的呢? 这里我们依然以Bookinf ...
- CoreDNS Plugins ---> hosts
需求 kubernetes集群外部有少量服务,kubernetes集群内部pod需要通过服务所在的主机的hostname访问服务. 解决方案 通过coredns的hosts插件配置kubernetes ...
- PHP学习 类型 变量 常数 运算符
PHP支持下列8种类型 标量类型 scalar type整数 integer浮点数 float double布尔 boolean字符串 string 特殊类型 special typeNULL资源 r ...
- android开发之使用SQLite数据库存储
http://blog.csdn.net/jason0539/article/details/16360835 SQLite 介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且 ...
- linux第三章学习笔记
第三章 进程管理 进程是Unix操作系统抽象概念中最基本的一种. 进程管理是所有操作系统的心脏所在. 一.进程 1. 进程是处于执行期的程序.除了可执行程序代码,还包括打开的文件.挂起的信号.内核内部 ...