首页 > 其他分享 >NEFU OJ Problem 1489 青蛙赶路 题解【动态规划DP】

NEFU OJ Problem 1489 青蛙赶路 题解【动态规划DP】

时间:2023-11-19 14:12:53浏览次数:53  
标签:OJ int 题解 ll NEFU res Find dp MOD

  • Problem:G
  • Time Limit:2000ms
  • Memory Limit:65535K

Description

有一只青蛙,每秒选择走1米或跳m米,青蛙体力不足,所以不能连续两秒都在跳。
青蛙将移动到[l,r]之间,它想知道有多少种不同的方式来实现其目标。
两种方式是不同的,当且仅当它们移动不同的米或花费不同的秒,或者是在一秒钟内,其中一个走而另一个跳。

Input

第一行输入包含2个整数n和m,n是查询数。(n <= 100000,2 <= m <= 100000)
对于下n行,每行包含两个整数l和r.(1 <= l <= r <= 100000)

Output

对于每个查询,输出到达的方案数,最后是模1000000007的答案。

Sample Input

4 4
4 4
1 4
1 5
1 6

Sample Output

2
5
8
12

思路

由于不能连续跳两次,所以除最后一次可能的跳跃外,每次跳之后必定走1米,于是将跳+走看作一个操作

所以目前只有两种操作

  1. 走:前进\(1\)米
  2. 跳+走:前进\(m+1\)米。

注意其实还有第三种操作,即在最后一步选择跳跃,如果采用这种策略则可以在\([l-m,r-m]\)区间跳跃来达到最后一步到终点的效果。因此除了\([l,r]\)区间的DP值外还需要加上\([l-m,r-m]\)区间的DP值

代码如下

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int N = 1e5+1, MOD = 1000000007;
ll dp[N], s[N];

int n, m;
ll Find(int x)
{
    if(x < 0)
        return 0;
    ll res = 0;
    if(dp[x] != -1)
        return dp[x];

    if(x-1 >= 0)
        res += Find(x-1);

    if(x - m - 1 >= 0)
        res += Find(x-m-1);

    res = res % MOD;
    return dp[x] = res;
}
int main()
{
    cin >> n >> m;
    memset(dp, -1, sizeof dp);

    dp[0] = 1;
    s[0] = 1;//这里我用了前缀和,好像没必要
    for (int i = 1; i < N; i ++)
    {
        s[i] = s[i-1] + Find(i);
        s[i] = s[i] % MOD;
    }
    for (int i = 0; i < n; i ++)
    {
        ll res = 0;
        int l,r;
        cin >> l >> r;
        //计算[L, R]区间
        res = s[r] - s[l-1];

        //处理端点值,计算[L-m, R-m]区间
        l = max(0, l-m);
        r = max(0, r-m);
        if(l == 0)
            res += s[r];
        else
            res += s[r] - s[l-1];
        res = res % MOD;

        cout << res << endl;
    }


    return 0;
}

标签:OJ,int,题解,ll,NEFU,res,Find,dp,MOD
From: https://www.cnblogs.com/eChorgi/p/17841981.html

相关文章

  • NEFU OJ Problem1485 贪吃蛇大作战 题解
    Problem:FTimeLimit:1000msMemoryLimit:65535K题目Description贪吃蛇大家一定都玩过吧,现在宋哥也要玩这个游戏,最初的时候贪吃蛇从屏幕的左下角出发,但是有一个非常不幸的事情,就是宋哥的游戏机的左键和下键坏掉了,这意味着什么?没错!他只能操控他的蛇向右或向上走了,假设屏幕......
  • ICPC2023深圳部分题解(A,D,E,F,G,K,L)
    目录正题A一道好题题目大意解题思路D机器人兄弟题目大意解题思路E二合一题目大意解题思路F见面礼题目大意解题思路G相似基因序列问题题目大意解题思路K四国军棋题目大意解题思路LMary有颗有根树题目大意解题思路正题好像还没上gym所以放不了题目链接,深圳这场的题目我觉......
  • ctf.show 信息泄露部分题解
    源码泄露根据题目可以知道这个是源码泄露,所以是看源代码,查看源代码的三种方式:CTRL+U,F12,右键选择查看源代码,flag就在源代码内前台JS绕过启动靶场后给出的提示是无法查看源代码,右键和F12都无法使用,题目是前台JS绕过,所以我们进入浏览器的设置界面,搜索javascript找到后把他禁用,然后再返......
  • 洛谷 P9869 [NOIP 2023] 三值逻辑 题解
    https://www.luogu.com.cn/problem/P9869?contestId=145259看到要给变量赋初始值,还是T,F,U之类的,容易想到2-SAT。设\(1\simn+m\)的点表示\(x_1,x_2,\dots,x_{n+m}\)为T的点,其中\(x_{k+n}(1\leqk\leqm)\)表示在第\(k\)次操作被操作的变量的值(操作......
  • qemu-kvm: error: failed to set MSR x38d to x0x 【问题解决】
    问题解决创建报错在下面的issues找到解决办法https://github.com/GNS3/gns3-server/issues/1774可以尝试在VM上禁用MSR,然后检查是否可以启动qemu计算机添加内核模块参数临时修改echoY>/sys/module/kvm/parameters/ignore_msrs或者永久修改cat>/etc/modp......
  • AT_code_festival_2018_quala_b题解
    题意给定一个序列,里面的值只有可能是\(a\)或\(b\)(\(a<b\))。有\(m\)个区间,这里面的值必须是\(a\),求如何是序列总和最大。思路因为\(n\)和\(m\)都只有100,所以可以先暴力将所有值设为\(b\),再将区间里的值暴力修改为\(a\),最后统计答案。ACCODE#include<bits/stdc......
  • P9779 题解
    思路因为不一定是只有一个答案,也就是多选题。所以就转化成了在\(n\)个里面选若干个。而每种个数必须都试一次。所以答案为:\[\sum_{i=1}^{i\len}C_n^i\]\(C_n^m\)表示在\(n\)个里面选\(m\)个方案数,即组合问题。众所周知,\[2^n=\sum_{i=0}^{i\len}C_n^i\]而\(......
  • P9782 题解
    题意给定两个字符,分别是两个\(26\)进制数,\(A\)到\(Z\)分别表示\(0\)到\(25\)。求这两个字符的和。答案同样用这种\(26\)进制表示。不包含前导\(0\)。思路先转化成\(10\)进制,再转化成\(26\)进制即可。而因为只有一位所以就不用写循环,直接算出\(10\)进制下的和......
  • SP3889 Closest Number题解
    题意简述有两个\(n\)位十进制数\(a\),\(b\)。要将数字\(b\)的每一位重新排列后,使得得到的数字一个在大于等于\(a\)的情况下更接近\(a\),另一个在小于\(a\)的情况下更接近\(a\)。求这两个数,如果找不到就输出0。思路以大于等于\(a\)的为例。我们可以将\(b\)从小......
  • AT_gigacode_2019_b 题解
    本题考查基本语法。思路用while来枚举每一组数据,用if判断是否合法。在判断时需要使用逻辑运算符&&,它的意思是左右两个要求如果同时成立,则会返回true,否则返回false。\(a\gex\),\(b\gey\),\(a+b\gez\)。这三个条件都要同时成立,所以可以使用&&。ACCODE#include......