标签:
题目网址:http://codeforces.com/problemset/problem/407/B
One day, little Vasya found himself in a maze consisting of (n + 1) rooms, numbered from 1 to (n + 1). Initially, Vasya is at the first room and to get out of the maze, he needs to get to the (n + 1)-th one.
The maze is organized as follows. Each room of the maze has two one-way portals. Let‘s consider room number i(1 ≤ i ≤ n), someone can use the first portal to move from it to room number (i + 1), also someone can use the second portal to move from it to room number pi, where 1 ≤ pi ≤ i.
In order not to get lost, Vasya decided to act as follows.
Help Vasya determine the number of times he needs to use portals to get to room (n + 1) in the end.
Input
The first line contains integer n (1 ≤ n ≤ 103) — the number of rooms. The second line contains n integers pi (1 ≤ pi ≤ i). Each pidenotes the number of the room, that someone can reach, if he will use the second portal in the i-th room.
Output
Print a single number — the number of portal moves the boy needs to go out of the maze. As the number can be rather large, print it modulo 1000000007(109 + 7).
Sample Input
2
1 2
4
4
1 1 2 3
20
5
1 1 1 1 1
62
思路:开辟一个数组q[],q[i]表示从第i个房间的第二个门走到p[i]房间然后回到i房间的路程
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <cmath> using namespace std; int p[1005]; int q[1005]; int main() { int n,i,j; long long sum,sum1; while(cin>>n) { sum=2; memset(q,0,sizeof(q)); for(i=1;i<=n;i++) cin>>p[i]; q[1]=2; for(i=2;i<=n;i++) { sum1=0; if(p[i]<i) { for(j=p[i];j<i;j++) { sum1+=q[j]; } sum1=sum1+2; if(sum1>=1000000007) sum1=sum1%1000000007; q[i]=sum1; sum+=sum1; } else { q[i]=2; sum=sum+2; } if(sum>=1000000007) sum=sum%1000000007; } cout<<sum<<endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/chen9510/p/4982360.html