[USACO13NOV] Pogo-Cow S

题目传送门

题解

首先,一眼DP,想想怎么推状态转移方程

朴素DP

定义二维数组 \(f[i][j]\),其中第一维表示当前所在的目标点是\(i\),第二维表示上一个到达的目标点\(j\),即是由目标点\(j\)转移到目标点\(i\),处于\(i\)点的最大得分

设\(k\)表示\(j\)的上一个目标点,易得方程:

\[f_{i,j}=max\{f_{i,j} ,f_{j,k}+p_i\}
\]

那么我们需要三层循环,分别枚举\(i,j,k\);

当然依照题意,我们需要两次DP,从左往右推和从右往左推,然后取最大值才是正确答案

就像我忘记推两遍所以多WA一次

如果你按照上面的方程打好了,提交,恭喜你TLE

单调队列优化DP

\(n\le 1000\)的限制使朴素DP被卡死,我们想办法用单调队列优化这个方程。单调队列通常用来维护单调性(多为递增或递减),在使用时只用到极值,但还是需要把每个元素进一次队列,因为题目中可能会有其他限制使当前最大值不符合要求,此时令最大值出队列,不断寻找符合条件的次大值。

题目中也有对于方程的限制条件:

每次跳跃的距离至少和上一次跳跃的距离相等,并且必须跳到一个目标点

可以得到方程的限制条件

\[f_{i,j}=max\{f_{i,j} ,f_{j,k}+p_i\}(x_i-x_j\ge x_j-x_k)
\]

改变这个方程,得到另一个方程

\[f_{i-1,j}=max\{f_{i-1,j},f_{j,k}+p_i \}(x_{i-1}-x_j\ge x_j-x_k)
\]

我们可以发现\(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}\),代入方程

\[f_{i,j}=max\{f_{i-1,j}-p_{i-1}+p_i ,f_{j,k}+p_i \}(x_i-x_j\ge x_j-x_k)
\]
\[f_{i,j}=max\{f_{i-1,j}-p_{i-1},f_{j,k} \}+p_i(x_i-x_j\ge x_j-x_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的更多相关文章

  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. P3089 [USACO13NOV]POGO的牛Pogo-Cow

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

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

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

  4. POJ 3278 Catch That Cow(bfs)

    传送门 Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 80273   Accepted: 25 ...

  5. 【BZOJ1623】 [Usaco2008 Open]Cow Cars 奶牛飞车 贪心

    SB贪心,一开始还想着用二分,看了眼黄学长的blog,发现自己SB了... 最小道路=已选取的奶牛/道路总数. #include <iostream> #include <cstdi ...

  6. HDU Cow Sorting (树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2838 Cow Sorting Problem Description Sherlock's N (1  ...

  7. [BZOJ1604][Usaco2008 Open]Cow Neighborhoods 奶牛的邻居

    [BZOJ1604][Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 试题描述 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发 ...

  8. 细读cow.osg

    细读cow.osg 转自:http://www.cnblogs.com/mumuliang/archive/2010/06/03/1873543.html 对,就是那只著名的奶牛. //Group节点 ...

  9. POJ 3176 Cow Bowling

    Cow Bowling Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13016   Accepted: 8598 Desc ...

  10. raw,cow,qcow,qcow2镜像的比较

    在linux下,虚拟机的选择方式有很多,比如vmware for linux,virtual box,还有qemu,在以前,使用qemu的人不多,主要是使用起来有些麻烦,但现在随着Openstack的 ...

随机推荐

  1. mixin混合

    多个组件有相同的逻辑,抽离出来 mixin并不是完美的解决方案,会有一些问题 vue3提出composition api旨在解决这些问题

  2. 每天学五分钟 Liunx | 有趣的 log

    说明:看 systemd log 的时候发现了一段有意思的打印,不太明白为什么会这样,贴出来与朋友们分享,欢迎知道的朋友们说明下,非常感谢.   问题描述:服务启动时,会执行 python 脚本,该脚 ...

  3. Linux系统CPU异常占用(minerd 、tplink等挖矿进程)

    转载请注明出处: 云服务器ECS(Linux) CPU使用率超过70%,严重时可达到100%,服务器响应越来越慢.  服务器中存在恶意minerd.tplink进程 该进程是服务器被入侵后,被恶意安装 ...

  4. SD 控制器集成需求和寄存器列表

    AHB Bus SD Bus DFT & Interrupt 控制集成需求 功能列表 控制器框架图 顶层信号 硬件集成环境 寄存器描述

  5. 为什么 sort() 中的 return a-b 可以决定升序

    arr.sort( function(a,b){ return a-b; } ) 千万不要理解成 a 减 b 其实它代表的是26个字母中的 a 和 b b 比 a 大,所以 a - b 就是升序,写成 ...

  6. [转帖]阿里云Redis开发规范(供大家参考)

    一.键值设计 1. key名设计 (1)[建议]: 可读性和可管理性 以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:id ugc:video:1 (2)[建议]:简洁性 ...

  7. [转帖]Oracle 19c 新特性|增加 VARCHAR2 数据类型的大小限制

    JiekeXuAll China Database Union2022-10-13 795 经朋友介绍,我读完 Tim Hall 于 2022 年 9 月 27 日他的博客上发表的博文.10 月 11 ...

  8. [转帖]被误解的CPU利用率、超线程、动态调频 —— CPU 性能之迷 Part 1

    https://blog.mygraphql.com/zh/notes/hw/hyper-threading/ 引 性能测试.压力测试.业务系统性能容量评估.这 3 件事,可以认为是大部分程序员/软件 ...

  9. SPEC2006的学习与总结

    SPEC2006的学习与总结 摘要 最近特别想进行一些性能验证工作. 所以研究了spec2006 然后想整理一下之前的内容. 想着将内容整理一下. 这次主要是抄别人的. 知识来源: https://b ...

  10. Linux用户以及ssh安全相关设置

    Linux用户相关操作 摘要 最近重保, 需要进行网络安全防护. 部分同事处理过程总是顺序有一些不太对的情况. 同时发现自对Linux用户设置也存在很多不清不楚的地方 所以趁着周末学习和总结一下. 用 ...