CodeForces - 407B G - 長いパス

G - ロングパス

 CodeForces - 407B 

件名の説明:

マークを作るためにどこでも、1から始まります。マークが奇数I + 1、外出先の部屋であれば、タグ付けていないときに私には、[I]で偶数Pを行きます。多くのステップが歩いたとn + 1部屋に行きましたか尋ねてください。

分析:

DFSはT.確かにするかどうか だから、関係を探しているDP。DPは、[i]はどこへ行くの手順で数iを1から番号です。P [i]は<= Iので。すべての到着I + 1は、iが奇数番号iからでなければなりません。その後、標識後に来た私も数です。I + 1は2回行った最初のiに来ています。[i]はPに行き、戻ってその1の私で2回、。彼は、チャネル1 I + 1に属していないため、距離からのI + 1とこれまでは、あなたは、彼をカット、彼になくなって白を想像することができます。

I + 1には2つの方法があるように、それは考えることができます。

1. 1からのI + 1に、[I] +1ステップがDP。P [i]はiから+ 1 2、(DP [I] +1)-dp [P [i]のステップがあります。

再帰DP [I + 1] =( 2 *(DP [I] +1)-dp [P [I])%のMOD

コード:

する#include <stdio.hに> 
する#include <CStringの> 
する#include <アルゴリズム> 
の#include <CStringの> 
する#include <cmath> 
の#include <ベクトル> 
の#include <iostreamの>
 使用して 名前空間をSTD。
typedefの長い 長いLL。
const  int型 MOD = 1E9 + 7 int型のp [ 1006 ]; 
LL DP [ 1006 ]。
int型のmain()
{ 
    int型、nは 
    scanf関数(" %のD "、&N) 
    以下のためのINT iは= 1 ; iが<= N; I ++ 
    { 
        scanf関数(" %のD "、&P [I])。
    } 
    DP [ 1 ] = 1 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。
    リターン 0 ; 
}

 

 

おすすめ

転載: www.cnblogs.com/studyshare777/p/12386766.html