필기시험 스톱. - 톱.

제목 설명:
/**
  n+1   ,         1 2 3...i,
            ,i               pi(1<=pi<=i),
        1    (    1      ),
            :
    A.           i    ,          i+1;
    B.           i    ,       pi;
             n+1         ;

    :
         n(30%  1<=n<=100,100%   1<=n<=1000),       ,
       n    pi(1<=pi<=i), pi     i       pi。

    :
      ,         ,       1000000007 (10e9 + 7)   。

    1:
2
1 2

    1:
4

    1:
     1            p1    1,       A    2,  2             B    2,      A    3,      3   4    。
*/

아이디어는 다음과 같습니다.
dp[i]를 i문에 도달하기 위해 설정하고 진입 횟수가 짝수일 때 이동해야 하는 횟수는 처음에 0이고 두 번째는 1에 들어가야 한다. 제목 때문에 dp[N]-1+1을 요구한다. (빼기 1은 초기 상태가 1에 들어가야 하기 때문에 1짝N->기N+1을 추가한다)
코드는 다음과 같습니다.
#include
#include

#define MAX_N 1005
#define MOD 1000000007

using namespace std;

int dp[MAX_N], pos[MAX_N];

int main()
{
    int N;
    while(cin>>N)
    {
        for(int n=1; n<=N; n++)
        {
            scanf("%d", pos+n);
        }
        if (N == 1)
        {
            cout << "1" << endl;
            continue;
        }
        for(int i=1; i<=N; i++)
        {
//            dp[i] = (dp[i-1]+1)%MOD;//    i->i+1
//            dp[i] = (dp[i]+1)%MOD;// i->pos[i]
//            dp[i] = (dp[i]+((dp[i-1]-(dp[pos[i]-1]+1)+MOD)%MOD))%MOD;//    pos[i]->   i-1     
//            dp[i] = (dp[i]+1)%MOD;//    i-1->   i
                //  
                dp[i] = (2 * dp[i - 1] %MOD- dp[pos[i] - 1] + 2) % MOD;
        }
        cout<

좋은 웹페이지 즐겨찾기