ホームページ  >  記事  >  ウェブフロントエンド  >  Codeforces ラウンド #239 (ディビジョン 2)_ロング パス_html/css_WEB-ITnose

Codeforces ラウンド #239 (ディビジョン 2)_ロング パス_html/css_WEB-ITnose

WBOY
WBOYオリジナル
2016-06-24 12:06:09881ブラウズ

質問リンク

  • 質問の意味:
    現在のポイントと入力ポイント (関連ポイント) の間にエッジがあることを示す n 値を入力します。最初は1から始まり、ある点に到達すると、ポイントの値が1ずつ増加します。このときの値が奇数の場合は、対応する点に移動します。それ以外の場合は、右側の隣接する点に到達します。 n+1 に達したときに何回転送する必要があるかを計算します
  • 分析:
  • 最初に点 P に到着したときの状況を考えてください。前の各点の値は偶数でなければなりません (前の点からのみ取得できます)値が偶数の場合のみ右に進むことができます)。このとき、現在の点の値は奇数であるため、関連する点 Q に到達します (現在の点の右側にあってはなりません)。次の点に到達したい場合は、続行する必要があります。点 Q から点 P まで、このときの状況は と同じです。 最初から点 Q までの状況はまったく同じです (値が偶数でゼロは明らかに等しい)、つまり部分問題が得られます。
  • 理解:
  • この質問の状態遷移は DAG ではありませんが、遷移が条件付きであることがわかり、現在の時点から遡ると前の状態にしか到達できないため、DP を考慮できます
    同様に、DPでもこの「リング」にどう対処するかが鍵となります
  • const int MAXN = 1100;int ipt[MAXN], dp[MAXN];int main(){//    freopen("in.txt", "r", stdin);    int n;    while (~RI(n))    {        CLR(dp, 0);        FE(i, 1, n) RI(ipt[i]);        FE(i, 1, n)        {            dp[i + 1] = (2 * dp[i] % MOD + MOD + 2 - dp[ipt[i]]) % MOD;        }        WI(dp[n + 1]);    }    return 0;}



    声明:
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。