首页 > 其他分享 >[刷题笔记] Luogu P1725 琪露诺

[刷题笔记] Luogu P1725 琪露诺

时间:2023-08-11 23:24:57浏览次数:53  
标签:一个点 int Luogu 位置 pos 露诺 forall P1725 include

Problem

Description

若当前在\(pos\)位置,每次可以在\([pos+l,pos+r]\)区间内任选一个点跳。每跳到一个地方就可以获得这个地方的值,最后跳到位置\(pos \geq n\)即为结束,求如何跳才能使结束的时候获得的值最大?

Analysis

我们发现所有操作都是在一条链上完成的,显然若再次跳到这个位置时的值不如上次则此时继续跳对答案是没有贡献的。也就是说局部最优解可以被利用。同时我们发现前面如何跳到了这个位置对于后面跳是没有影响的,符合无后效性,考虑dp。

我们发现每跳到一个点\(pos\),她对什么有贡献呢?显然是对\(\forall i\in [pos+l,pos+r]\)有贡献。具体地,若定义\(f_i\)表示前\(i\)个点的最大值,则满足:

\(f_i=max(f_i,f_{pos}+a_i)\)

补充:和上文同理满足\(\forall i\in [pos+l,pos+r]\),\(a_i\)指当前位置的值。

Explanation:每个点\(i\)都可以先跳到\(pos\)再跳到\(i\)(因为满足\(\forall i\in [pos+l,pos+r]\),显然一个点\(i\)可能会被访问很多次,因为很可能有很多个\(pos\)可以到\(i\),取max即可)

由于本题数据很水朴素dp就能过,先不写优化了awa

Code

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define INF 0x3f3f3f3f
using namespace std;
const int N = 200010;
int n,l,r;
int f[2*N];
int a[2*N];
int ans = -1e9;
int main()
{
    scanf("%d%d%d",&n,&l,&r);
    for(int i=0;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    memset(f,-0x3f,sizeof(f)); //由于有负数所以需要初始化为MINN
    f[0] = 0; //依据题意第0为的值为0
    for(int i=0;i<=n;i++) //枚举pos
    {
        for(int j=i+l;j<=i+r;j++) //每个pos对谁产生贡献? 
        {
            f[j] = max(f[j],f[i]+a[j]);
        }
    }
    for(int i=n;i<=n+r;i++) ans = max(ans,f[i]); //由于跳到n外也算离开,观察上面dp程序显然发现最多跳到n+r,取max即可
    cout<<ans<<endl;
    return 0;
}

标签:一个点,int,Luogu,位置,pos,露诺,forall,P1725,include
From: https://www.cnblogs.com/SXqwq/p/17624130.html

相关文章

  • 题解 LuoguP3306 [SDOI2013] 随机数生成器
    题目链接:【LuoguP3306】。前置知识OI-Wiki:快速幂,扩展欧几里得算法(exgcd),BabyStep,GiantStep算法。题意很清楚,不说。分析当\(t=x\)时答案很明显为\(1\),即在第一天就可以读到。当\(t\neqx\)时当\(a=0\)时观察一下规律:\[x_1\equivx_1\pmod{p}\]\[x_2\equivb......
  • [刷题笔记] Luogu P1280 尼克的任务
    ProblemAnalysis首先,如果一个时间只有一个任务开始,则她必须做。如果一个时间有多个任务开始,她可以选一个去做。我们发现这样的决策是取决于后面的空暇时间,而不是前面。所以在dp的时候需要从后往前搜时间(当然如果从前往后可以跑记搜)考虑转移,如果一个时间有多个任务开始,则选一个......
  • luogu P4200 千山鸟飞绝 题解 【一维数组套平衡树】
    目录题目解题思路code题目题目链接解题思路首先,此题有明显的插入、删除、查找,所以必须要使用平衡树。考虑如何使用平衡树维护每个鸟的状态。发现很不方便,因为鸟的位置改变,整个平衡树的值都要修改。考虑针对每个节点开一颗平衡树,这样就有\(3e4\times3e4\)棵树。这显然太多了......
  • luogu P7352 炉心融解
    记\(f_S\)为所有人以当前信息推断出\(S\)这种情况是否合法,\(g_S\)表示假如真实情况是\(S\),应该有哪些人喊出来了。每一轮中,通过告诉你的\(k\)条消息可以推断出哪些集合不合法,将其\(f_S\)赋为\(0\),然后根据新的\(f_S\),有些人可能可以据此喊了,所以根据新的\(f_S\)更......
  • 【题解】Luogu[P9504] 『MGOI』Simple Round I C. 魔法禁林
    Link这题我们发现如果直接去枚举生命和法力值显然是不行的,又看到说最小的生命值,不禁想到最短路,但是怎么跑?我们令经过一条边之前魔力值为\(k\),那么该边的边权为\(\lfloor\dfrac{w}{k}\rfloor\),于是我们讲题目转化为了边权为\(\lfloor\dfrac{w}{k}\rfloor\)时\(s\)到\(t\)......
  • 【LuoGU 1462】通往奥格瑞玛的道路——最短路+二分
    通往奥格瑞玛的道路题目背景在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量。有一天他醒来后发现自己居然到了联盟的主城暴风城。在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛。题目描述在艾泽拉斯,有\(n\)个城市。编号为\(1,2,3,\ldots,n\)。......
  • [刷题笔记] LuoguP1156 垃圾陷阱
    ProblemDescription题目描述了几个状态,我们来理顺一下:一头牛掉进了坑里,农夫会在几个时段向下扔垃圾,牛初始可以撑10h,对于每一个垃圾,牛可以:把它堆起来,一旦垃圾堆的高度超过\(h\),她就可以爬出来吃掉它垃圾好吃吗,并且获得能量值需要注意的是,牛可以撑到下一次垃圾投放的标......
  • [刷题笔记] Luogu P2014 [CTSC1997] 选课
    ProblemSolution我们发现本题中有好多主从关系,即要想取用一个儿子必须先取用她的父亲。构成了一个森林,处理不便。有个小技巧,就是将0号节点参与建树,最后所求节点数就变成了\(m+1\),且把森林变成了一棵树。然后如何处理呢?再次理解题意,我们发现,我们每次的决策是是否取用儿子,取用......
  • [刷题笔记][算法模型总结] Luogu P1880 [NOI1995] 石子合并 || 区间dp之合并石子模型
    ProblemSolution本题还有一个弱化版,见LuoguP1775我们发现本题和弱化版唯一区别就是本题有环。我们先将弱化版的内容。EasyversionDescription弱化版是给定了好多堆石子,每相邻的两堆可以合并成一个大堆,每次合并会产生两个石头重量和的价值,最后会将若干堆石子合并为一堆。......
  • [Luogu P8744] 左孩子右兄弟 题解
    题目大意给定一棵节点个数为\(N\)的多叉树,求其通过"左孩子右兄弟"表示法转化成的二叉树,高度最高是多少。解决思路首先分辨出此题目是树状DP,并了解"左孩子右兄弟"表示法的转换方式,便开始考虑DP的状态转移方程。状态由于每个节点由\(1\)至\(N\)编号,那么就使用\(dp_{k......