G - ロングパス
マークを作るためにどこでも、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つの方法があるように、それは考えることができます。
再帰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 ; }