CodeForces - 407B G - Long Path
G - Long Path
从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:
递推式 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; }