P3089 Pogo-Cow S
[USACO13NOV] Pogo-Cow S
题解
首先,一眼DP,想想怎么推状态转移方程
朴素DP
定义二维数组 \(f[i][j]\),其中第一维表示当前所在的目标点是\(i\),第二维表示上一个到达的目标点\(j\),即是由目标点\(j\)转移到目标点\(i\),处于\(i\)点的最大得分
设\(k\)表示\(j\)的上一个目标点,易得方程:
\]
那么我们需要三层循环,分别枚举\(i,j,k\);
当然依照题意,我们需要两次DP,从左往右推和从右往左推,然后取最大值才是正确答案
就像我忘记推两遍所以多WA一次
如果你按照上面的方程打好了,提交,恭喜你TLE
单调队列优化DP
\(n\le 1000\)的限制使朴素DP被卡死,我们想办法用单调队列优化这个方程。单调队列通常用来维护单调性(多为递增或递减),在使用时只用到极值,但还是需要把每个元素进一次队列,因为题目中可能会有其他限制使当前最大值不符合要求,此时令最大值出队列,不断寻找符合条件的次大值。
题目中也有对于方程的限制条件:
每次跳跃的距离至少和上一次跳跃的距离相等,并且必须跳到一个目标点
可以得到方程的限制条件
\]
改变这个方程,得到另一个方程
\]
我们可以发现\(f_{i,j}\)可以由\(f_{i-1,j}\)转移过来,但限制条件有所不同,每次\(x_j\)是不变的,从\(f_{i-1,j}\)转移到\(f_{i,j}\)时,一定有\(x_i\ge x_{i-1}\),因此\(k\)的取值也会改变,用单调队列维护\(k\),得到符合要求的最大的\(f_{j,k}\),代入方程
\]
\]
核心代码
for(int j=1;j<=n;j++){
f1[j][j]=cow[j].p;//边界
int k=j;
for(int i=j+1;i<=n;i++){
f1[i][j]=f1[i-1][j]-cow[i-1].p;
int isaac=0;
while(k>=1&&cow[i].x-cow[j].x>=cow[j].x-cow[k].x){
isaac=Max(isaac,f1[j][k]);
k--;
}
f1[i][j]=Max(f1[i][j],isaac);
f1[i][j]+=cow[i].p;
maxn=Max(maxn,f1[i][j]);
}
}
观察上面的单调队列,好像并没有入队列的操作,其实\(k\)是从\(j\)开始维护的,相当于把从\(j\)到\(1\)的所有\(f_{j,k}\)都入了队列,且\(f_{i,j}\)是由\(f_{i-1,j}\)转移过来的,一定有\(f_{i,j}\ge f_{i-1,j}\),只需枚举每一个符合条件的\(k\)找到极大值,再进行转移,又因为\(x_i\ge x_{i-1}\),\(i\)的取值范围一定包含\(i-1\)的取值。
正确性
设\(i\)的取值范围左边界为\(k_i\) , \(i-1\)对应\(k_{i-1}\)
则\(f_{i-1,j}-p_{i-1}\)就是\(k_{i-1}\)到\(j\)的最大值,\(f_{i,j}\)直接使用\(f_{i-1,j}+p_{i-1}\),再枚举区间\([k_i,k_{i-1})\),从中取最大值进行转移,相当于直接使用$ [k_i,j]$区间最大值,保证算法正确。
时间复杂度 \(O(n^2)\)
每个元素最多出队列一次,复杂度是\(O(n)\),总的复杂度就是\(O(n^2)\)
Code
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+100;
int n,f1[N][N],maxn,f2[N][N];
struct pogo{
int x,p;
}cow[N];
bool cmp(pogo a,pogo b)
{
return a.x<b.x;
}
inline int Max(int a,int b)
{
return a>b?a:b;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&cow[i].x,&cow[i].p);
maxn=Max(maxn,cow[i].p);
}
sort(cow+1,cow+n+1,cmp);
for(int j=1;j<=n;j++){
f1[j][j]=cow[j].p;
int k=j;
for(int i=j+1;i<=n;i++){
f1[i][j]=f1[i-1][j]-cow[i-1].p;
int isaac=0;
while(k>=1&&cow[i].x-cow[j].x>=cow[j].x-cow[k].x){
isaac=Max(isaac,f1[j][k]);
k--;
}
f1[i][j]=Max(f1[i][j],isaac);
f1[i][j]+=cow[i].p;
maxn=Max(maxn,f1[i][j]);
}
}
for(int j=n;j>=1;j--){
f2[j][j]=cow[j].p;
int k=j;
for(int i=j-1;i>=1;i--){
f2[i][j]=f2[i+1][j]-cow[i+1].p;
int isaac=0;
while(k<=n&&cow[j].x-cow[i].x>=cow[k].x-cow[j].x){
isaac=Max(isaac,f2[j][k]);
k++;
}
f2[i][j]=Max(f2[i][j],isaac);
f2[i][j]+=cow[i].p;
maxn=Max(maxn,f2[i][j]);
}
}
printf("%d",maxn);
}
P3089 Pogo-Cow S的更多相关文章
- [luogu] P3089 [USACO13NOV]POGO的牛Pogo-Cow
P3089 [USACO13NOV]POGO的牛Pogo-Cow 题目描述 In an ill-conceived attempt to enhance the mobility of his pri ...
- P3089 [USACO13NOV]POGO的牛Pogo-Cow
P3089 [USACO13NOV]POGO的牛Pogo-Cow FJ给奶牛贝西的脚安装上了弹簧,使它可以在农场里快速地跳跃,但是它还没有学会如何降低速度. FJ觉得让贝西在一条直线的一维线路上进行练 ...
- DP【洛谷P3089】 [USACO13NOV]POGO的牛Pogo-Cow
[洛谷P3089] [USACO13NOV]POGO的牛Pogo-Cow FJ给奶牛贝西的脚安装上了弹簧,使它可以在农场里快速地跳跃,但是它还没有学会如何降低速度. FJ觉得让贝西在一条直线的一维线路 ...
- POJ 3278 Catch That Cow(bfs)
传送门 Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 80273 Accepted: 25 ...
- 【BZOJ1623】 [Usaco2008 Open]Cow Cars 奶牛飞车 贪心
SB贪心,一开始还想着用二分,看了眼黄学长的blog,发现自己SB了... 最小道路=已选取的奶牛/道路总数. #include <iostream> #include <cstdi ...
- HDU Cow Sorting (树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2838 Cow Sorting Problem Description Sherlock's N (1 ...
- [BZOJ1604][Usaco2008 Open]Cow Neighborhoods 奶牛的邻居
[BZOJ1604][Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 试题描述 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发 ...
- 细读cow.osg
细读cow.osg 转自:http://www.cnblogs.com/mumuliang/archive/2010/06/03/1873543.html 对,就是那只著名的奶牛. //Group节点 ...
- POJ 3176 Cow Bowling
Cow Bowling Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13016 Accepted: 8598 Desc ...
- raw,cow,qcow,qcow2镜像的比较
在linux下,虚拟机的选择方式有很多,比如vmware for linux,virtual box,还有qemu,在以前,使用qemu的人不多,主要是使用起来有些麻烦,但现在随着Openstack的 ...
随机推荐
- v-cloak指令用法
插值表达式存在的问题:'闪动' 如何解决该问题:使用v-cloak指令 解决该问题的原理:先隐藏,替换好值之后再显示最终的值 背后的原理:先通过样式隐藏内容,然后在内存中进行值得替换,替换好之后再显示 ...
- 【架构师视角系列】Apollo配置中心之Client端(二)
原创文章,转载请标注.https://www.cnblogs.com/boycelee/p/17978027 目录 声明 配置中心系列文章 一.客户端架构 1.Config Service职责 (1) ...
- ORA-00947:Not enough values (没有足够的值)
1.问题 2.解决方式 大概率是关系表实际列数大于你所填的元素个数,请检查是否有疏漏的列即可. 我这里是以为代理键直接忽略不写即可,没有标明具体插入列,但是还是得标明才行 --创建图书目录表TITLE ...
- [转帖]TNS-12535 TNS-00505的处理方法
硬件说明: 操作系统版本:ORACLE LINUX 6.3 64位 数据库版本:11.2.0.3 64位 问题说明: 在检查数据库的alert日志的时候,发现大量的12170和TNS-12535 ...
- [转帖]tidb RESTORE
https://docs.pingcap.com/zh/tidb/v4.0/sql-statement-restore RESTORE 语句用于执行分布式恢复,把 BACKUP 语句生成的备份文件恢复 ...
- [转帖]Redhat 8 磁盘调度策略变化:NOOP改为NONE
说明 在 redhat 4/5/6/7版本中的NOOP调度策略,从8开始修改为NONE,官方解释: none Implements a first-in first-out (FIFO) schedu ...
- [转帖]一、Kafka Tool使用
一.Kafka Tool使用 1.添加cluster 2.开启SASL_PLAINTEXT 如果kafka 开启SASL_PLAINTEXT认证(用户名和密码认证) 3.高级设置 如果设置的是SASL ...
- [转帖]Innodb存储引擎-备份和恢复(分类、冷备、热备、逻辑备份、二进制日志备份和恢复、快照备份、复制)
文章目录 备份和恢复 分类 冷备 热备 逻辑备份 mysqldump SELECT...INTO OUTFILE 恢复 二进制日志备份与恢复 快照备份(完全备份) 复制 快照+复制的备份架构 备份和恢 ...
- [转帖]rsar - Extract data from plain-text sar files
sar -A -t -f /tmp/sa11 >/tmp/sar11 https://github.com/ryran/rsar When dealing with sysstat sar da ...
- 【转帖】Seccomp、BPF与容器安全
语音阅读2022-06-30 20:26 本文详细介绍了关于seccomp的相关概念,包括seccomp的发展历史.Seccomp BPF的实现原理已经与seccomp相关的一些工具等.此外,通过实例 ...