首页 > 其他分享 >P3089 题解

P3089 题解

时间:2023-08-22 18:56:04浏览次数:56  
标签:f2 const P3089 point int 题解 ll

P3089

令 \(f_1[i][j]\) 表示向右跳,从 \(j\) 跳到 \(i\) 的最大总得分,有状态转移方程:

\[f_1[i][j]=\displaystyle\max_{k<j<i,x_j-x_k \le x_i-x_j}\{f_1[j][k]+s_i\} \]

将 \(s_i\) 看作定值,整理得 \(f_1[i][j]=\displaystyle\max_{k<j<i,x_j-x_k \le x_i-x_j}\{f_1[j][k]\}+s_i\)

又因为

\[f_1[i-1][j]=\displaystyle\max_{k<j<i-1,x_j-x_k\le x_{i-1}-x_j}\{f_1[j][k]\}+s_{i-1} \]

似乎可以代入得 \(f_1[i][j]=f_1[i-1][j]-s_{i-1}+s_i\),但由于 \(x_{i-1}<x_i\),所以我们要先拓展 \(k\),然后再取最大值。

for(int j=1;j<=n;j++){
    f1[j][j]=s[j];
    for(int i=j+1,k=j+1;i<=n;i+++){
        f1[i][j]=f1[i-1][j]-s[i-1];
        while(k>1&&x[j]-x[k-1]<=x[i]-x[j]){
            k--;
            f1[i][j]=max(f1[i][j],f1[j][k]);
        }
        f1[i][j]+=s[i];
        ans=max(ans,f1[i][j]);
    }
}

向左跳同理,只要反着做一遍 DP 就可以了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1009;
struct point{ll s,x;}p[N];
ll n,f1[N][N],f2[N][N],ans;
bool cmp(const point&a,const point&b){
    return a.x<b.x;
}
int main(){
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++)  cin>>p[i].x>>p[i].s;
    sort(p+1,p+1+n,cmp);
    for(int j=1;j<=n;j++){
        f1[j][j]=p[j].s;
        for(int i=j+1,k=j+1;i<=n;i++){
            f1[i][j]=f1[i-1][j]-p[i-1].s;
            while
                (k>1&&p[j].x-p[k-1].x<=p[i].x-p[j].x){
                k--;
                f1[i][j]=max(f1[i][j],f1[j][k]);
            }
            f1[i][j]+=p[i].x;
            ans=max(ans,f1[i][j]);
        }
    }
    for(int j=n;j>=1;j++){
        f2[j][j]=p[j].s;
        for(int i=j-1,k=j-1;i>=1;i--){
            f2[i][j]=f2[i+1][j]-p[i+1].s;
            while(k<n&&p[j].x-p[k+1].x<=p[i].x-p[j].x){
                k++;
                f2[i][j]=max(f2[i][j],f2[j][k]);
            }
            f2[i][j]+=p[i].x;
            ans=max(ans,f2[i][j]);
        }
    }
    cout<<ans;
    return 0;
}

标签:f2,const,P3089,point,int,题解,ll
From: https://www.cnblogs.com/11jiang08/p/17649429.html

相关文章

  • P2572 序列操作 题解
    link。对平衡树的懒标记的应用题,其实和线段树也差不多。如果不考虑取反操作,那维护操作\(5\)就需要知道当前区间答案,当前区间前缀和后缀,因为在push_up时我们当前区间的答案肯定等于左区间的答案,右区间的答案以及左区间的后缀加上右区间的前缀这三者间的最大值。但与线段树不......
  • AGC032 A-D题解
    A最后一次插入的数的值与位置一定相同考虑倒着做每次从左往右扫一遍当遇到a[i]==i时将此数删除并跳出B当n为5时构造出的图如下(图形编辑器(csacademy.com))那么我们猜想当n为奇数时将n与其他点连边i与除了n-i的其他点连边证明:n的邻接点的编号之和为(n......
  • iOS开发之--获取验证码倒计时及闪烁问题解决方案
    大家在做验证码的时候一般都会用到倒计时,基本上大家实现的方式都差不多,先贴出一些代码来..-(void)startTime{__blockinttimeout=59;//倒计时时间dispatch_queue_tqueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);dispatch_source......
  • 国标GB28181视频平台EasyGBS国标平台激活码授权提示“授权失败”的问题解决方案
    EasyGBS平台是基于国标GB28181协议的视频云服务平台,支持多路设备接入,并对多平台、多终端分发出RTSP、RTMP、FLV、HLS、WebRTC等多种格式的视频流。平台可为大数据等综合性监管平台提供极强的视频能力,既能作为能力平台为业务层提供接口调用,也可作为业务平台使用。有用户反馈,现场Easy......
  • [CSP-J 2021] 网络连接 题解
    传送门早期题解,转自博客QwQ本蒟蒻为数不多过了的黄题,祝贺!!!题面[CSP-J2021]网络连接题目描述TCP/IP协议是网络通信领域的一项重要协议。今天你的任务,就是尝试利用这个协议,还原一个简化后的网络连接场景。在本问题中,计算机分为两大类:服务机(Server)和客户机(Client)。服务机......
  • 「JLOI2014」松鼠的新家 题解
    「JLOI2014」松鼠的新家前言这道题倒也不是很难,只是有一些小坑需要避一下,可以看作半个LCA树上差分裸题。解析考虑维护一个树,点\(u\)表示每个房间需要的糖果数\(s_u\),而维尼在参观房间时从\(a\)到\(b\)就需要在\((a,\tob)\)的路径上的每个房间都摆上一个糖果,这时直......
  • [ABC098D] Xor Sum 2 题解
    题解传送门题目大意给出一个序列\(A\),求\(A_l\oplusA_{l+1}\oplus\dots\oplusA_r=A_l+A_{l+1}+\dots+A_r\)(\(\oplus\)即为\(xor\)异或)解析众所周知,异或是位运算中的一种不进位加法,即为如果两个\(bit\)相等返回\(0\),反之返回\(1\)。为什么说是不......
  • 「NOIP2008 普及组」ISBN 号码 题解
    前言转自博客,早期黑历史作品。这是本蒟蒻の第一篇题解qwq,发在博客上,还请多多关照.这道题是一道橙题,难度没有太大的问题,对于大犇们来说自然是一遍过的,本蒟就只能调调再交了.题面传送门题目描述每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括99位数字、1......
  • 「NOIP2010」机器翻译 题解
    前言附加任务这道题也是一个简单模拟题。传送门解析这道题就是一个简单的模拟题,简单来说就是如果内存里面没有这个单词(其实是一个数)的话就从外存入队,如果内存容量不够,出队即可。对了,每次查询时还要计数噢!代码话不多说上代码#include<bits/stdc++.h>usingnamespacestd......
  • 「CSP-J2019」交通换乘 题解
    转自博客。传送门一道橙题,但是会T。题面[CSP-J2019]公交换乘题目描述著名旅游城市B市为了鼓励大家采用公共交通方式出行,推出了一种地铁换乘公交车的优惠方案:在搭乘一次地铁后可以获得一张优惠票,有效期为45分钟,在有效期内可以消耗这张优惠票,免费搭乘一次票价不超过地......