zoukankan      html  css  js  c++  java
  • [CSP-S模拟测试]:停不下来的团长奥尔加(DP)

    题目传送门(内部题125)


    输入格式

      第一行一个整数$n$,含义同题中所述。
      第二行$n$个整数,第$i$个数表示$p_i$,含义同题中所述。


    输出格式

      一行一个整数,表示答案对$1000000007(10^9+7)$取模后的结果。


    样例

    样例输入1:

    2
    1 2

    样例输出1:

    4

    样例输入2:

    4
    1 1 2 3

    样例输出2:

    20

    样例输入3:

    5
    1 1 1 1 1

    样例输出3:

    62


    数据范围与提示

    样例$1$解释:

      初始奥尔加在位置$1$上,因为这是他第$1$次到达位置$1$,所以第一步他会走到$p_i=1$上,此时的位置$1$已经到达了两次,所以第二步奥尔加会走到$1+1=2$位置上。
      同样的,奥尔加接下来会走$p_2=2$,$2+1=3$,一共花费$4$步到达$n+1$位置。

    样例$3$解释:

      你真的忍心让我全部列出来吗,所以说,不要停下来啊(指偷懒)。

    数据范围:

      对于$10\%$的数据,保证$1leqslant nleqslant 20$;
      对于另外$10\%$的数据,满足$p_i=i$;
      对于另外$20\%$的数据,满足$p_i=1$;
      对于另外$20\%$的数据,保证$1leqslant nleqslant 1,000$;
      对于$100\%$的数据,保证$1leqslant nleqslant 1,000,000,1leqslant p_ileqslant i$。


    题解

    考虑$DP$,定义$dp[i]$表示从$1$第一次到$i$的步数。

    那么我们可以列出状态转移方程:

    $$dp[i+1]=2 imes dp[i]-dp[p[i]]+2$$

    因为$p[i]leqslant i$,所以直接递推即可。

    时间复杂度:$Theta(n)$。

    期望得分:$100$分。

    实际得分:$100$分。


    代码时刻

    #include<bits/stdc++.h>
    using namespace std;
    const int mod=1000000007;
    int n;
    long long dp[1000002];
    int main()
    {
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++)
    	{int x;scanf("%d",&x);dp[i+1]=(2*dp[i]-dp[x]+2+mod)%mod;}
    	printf("%d",dp[n+1]);
    	return 0;
    }
    

    rp++

  • 相关阅读:
    Linux 第一个脚本程序
    Linux 8开启FTP功能服务
    PPT 倒计时时钟,用 GIF 动画实现,可直接使用 -- 附 Python 实现代码
    python flask 虚拟环境迁移
    GOLANG学习之路之二
    Golang学习之路之一
    vscode 调试flask项目 解决(socket.gaierror: [Errno 11001] getaddrinfo failed)
    windows下部署 flask (win10+flask+nginx)
    git入门
    配置maven的国内镜像
  • 原文地址:https://www.cnblogs.com/wzc521/p/11803102.html
Copyright © 2011-2022 走看看