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的 ...
随机推荐
- 深度学习降噪专题课:实现WSPK实时蒙特卡洛降噪算法
大家好~本课程基于全连接和卷积神经网络,学习LBF等深度学习降噪算法,实现实时路径追踪渲染的降噪 本课程偏向于应用实现,主要介绍深度学习降噪算法的实现思路,演示实现的效果,给出实现的相关代码 线上课程 ...
- VueTreeselect
https://www.vue-treeselect.cn/ 官网简介
- Threejs实现一个园区
一.实现方案 单独贴代码可能容易混乱,所以这里只讲实现思路,代码放在最后汇总了下. 想要实现一个简单的工业园区.主要包含的内容是一个大楼.左右两片停车位.四条道路以及多个可在道路上随机移动的车辆.遇到 ...
- 【SHELL】命令补全
# 指定文件 dodo_path=/home/skull/work/scripts/dodo echo "hello skull" ## COMP_WORDS 是一个 bash 内 ...
- Qt5.9 UI设计(一)——在win10系统上安装Qt5.9
安装环境 win10 系统 Qt5.9.0 版本 官方下载地址 可以从官方网站获取:https://www.qt.io/zh-cn/ 现在的安装包跟以前的有些区别,加上网络比较慢,我这里演示的是Qt5 ...
- [转帖]Kubernetes1.25.6部署文档 使用cri-docker部署K8s1.25.6
https://zhuanlan.zhihu.com/p/600808149 本文档将通过kubeadm+docker部署K8s集群,本次集群使用的容器运行工具为docker,K8s的容器运行工具也可 ...
- [转帖] 请求量突增一下,系统有效QPS为何下降很多?
https://www.cnblogs.com/codelogs/p/17056485.html 原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 最近我观察到一 ...
- [转帖]15 个必须知道的 chrome 开发工具技巧
在Web开发者中,Google Chrome是使用最广泛的浏览器.六周一次的发布周期和一套强大的不断扩大开发功能,使其成为了web开发者必备的工具.你可能已经熟悉了它的部分功能,如使用console和 ...
- [转帖]Linux使用Stress-ng测试CPU、内存、磁盘I/O满载情况教程与范例
https://www.xiaoyuanjiu.com/108301.html 介绍如何在 Linux 系统上使用 stress-ng 负载测试工具,产生 CPU.内存等资源满载的状况. stress ...
- [官方]华为的部分设备的SPECint_rate_2006的测试数据
Test Sponsor System Name BaseCopies Processor Results EnabledCores EnabledChips Cores/Chip Threads/C ...