CodeForces - 407B G - Long Path

G - Long Path

 CodeForces - 407B 

题目描述:

从1出发,每到一处做一个标记。在i处,还没加标记时,如果标记是奇数则走到i+1号房,偶数则走到p[i]处。问走多少步能走到n+1号房。

分析:

如果用dfs肯定会T。所以dp找关系。dp[i]为从1号到i处要走多少步。因为p[i]<=i。所有从i到达i+1,一定要i为奇数。然后走过之后加标记,i就变成偶数。就是走到i+1要先走到i处2次。在到i的2次中,其中有一次要往回走,走到p[i]。离i+1的距离又远了,可以把他想象成白走了,把他减出来,因为他不属于1到i+1的路。

也可以想成有2种方法到i+1:

1.从1到i+1,有dp[i]+1步。2.从p[i]到i+1,有(dp[i]+1)-dp[p[i]]步。

递推式 dp[i+1]=(2*(dp[i]+1)-dp[p[i]])%mod

代码:

#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <iostream>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
int p[1006];
ll dp[1006];
int main()
{
    int n;
    scanf("%d",&n); 
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&p[i]);
    }
    dp[1]=1;
    for(int i=0;i<=n;i++)
    {
        dp[i+1]=(2*(dp[i]+1)-dp[p[i]])%mod;
    }
    cout<<(dp[n+1]-2+mod)%mod<<endl;
    return 0;
}

 

 

posted on 2020-02-29 22:46  Aminers  阅读(98)  评论(0编辑  收藏  举报

导航