【SDOI 2010] [1925 bzoj]エルフ族(DP)

カジュアルワーキング:

ゴブリンは無限の山に住んでいるのが好き。左から右への山の長さN H Nはセクションに分割することができ、それぞれがHiは1とNの間の正の整数であるユニークな高さのHiを有します 山の部分はすべてその周辺の山よりも高くなっている場合、これは山のピークです。唯一のいくつかの隣接する山の山の端に位置し、他の2つ(すなわち左右)があります。いくつかの山は、すべてその周辺の山々よりも低い場合、これは山の谷です。パブは谷に設定することができます。ゴブリンは、彼らはゴブリンが願って、各観測ピークに設定することができ、また、非常に警戒生き物ですこのセクションN山脈全体のみ山脈の条件を満たすように、展望デッキやパブの一つ構築することができ、各セグメントあなたは生活を微する必要があります。今、あなたは長さnの、知りたいどのように多くの山に住んで罰金する必要があります。、そのような愛≠バイこと二つの範囲AとBは異なる場合であり、私が存在する場合にのみ。この数は大きくなる可能性があるので、あなたはそれに興味があるP.で割った余り

20データを満たすの%N≤10のための;
、データの40%、N≤18を満たすために
データの70%を、N≤550を満たすために、
3≤N≤4200を満たすために、データの100%に、P≦ 10 ^ 9

ソリューション:

まず第一に、私たちの目標は、xが山の位置であるときつまり、私たちは山の残りの部分から持っていると高さ比xで、山と谷が交互の順序でなければならない少数の、場所選びのx + 1を位置、反対が多数を選択します。

「無限の山」でカジュアルな作業をよると、我々は、n個のピークの1〜nは、中央に表示され、一度だけ、すべての番号を知ることができます。それがあるので、我々はいくつかの小さな例を見つけることができますShoumo「無限」(どうやら真剣に...そのようなことを言います)

0%のサンプル出力

押すなどの40%
  、データの範囲を見ては、ポイントの40%が実際のような圧力DP、DPが、何、それが表すように記述することができることを見出し?一般的に、成形圧力DP [I] [j]はi番目のビットを表すときに列挙状態と、プログラムjの数(この質問は、プログラムの数を要求されています)。そして、この質問はあなたに適用されますか?考える:ビットを列挙するとき、私は自分の家の状態jを置きます。のようですが、どのような状態を表現しますか?010101または101010?望ましくありません。とにかく、この著者は、こんにゃく、GUGU区を考えていませんでした。(アルゴリズムの40%が思っただろう...)実際には、状態

70%のO(N 3

  550 3余裕がかろうじてできます。我々は、[I] [J] [状態DPを記録 0/1]、iは残りのIの数を表す場合、下部、jは、J-1の添字が0のときだけ、選択された数よりも少ない数、谷を有する表しますそれは、1である(実際には、正と負の両方であることができる)のピークを表します。我々が定義した伝達方程式、DP [I] [J] [0] DP影響を与える可能性があり、[I-1]〜[J 〜i]が[1]、DP [I] [J] [1] DP影響を与える可能性があり、[I -1] [1〜J-1 ] [0]。その後、我々はDP [n]を初期化することができる[0] [ 0] = 未完。

%O 100(N 2

https://www.cnblogs.com/ac-evil/p/10338316.html

https://www.cnblogs.com/Yu-shi/p/11116895.html

https://www.cnblogs.com/cj-chd/p/9967904.html

コード:

1の#include <cstdioを>
 2の#include <CStringの>
 3  の#define $ 4444
 4  使用して 名前空間STD。
5  int型 M、N、MOD、DP [ 2 ] [$]、ANS。
図6は、 メイン(){署名し
 7      のscanf(" %d個の%のD "、&​​N、&MOD)を、
8      あれば(N == 1){のprintf(" %d個の\ n "1%のMOD)。リターン 0 ; }
 9      DP [ 0 ] [ 1 ] = 1 10     ため(登録INT I = 2今、= 1、ラス= 0 ; I <= N; ++ I、ラス=今、今^ = 1 ){
 11          (登録INT J = 1 ; jは<= I + + J)
 12              DP [今] [J] =(DP [今] [J- 1 ] + DP [ラス] [I-J + 1 ])%MOD。
13      }
 14      のため(登録をint i = 1 ; iは= N <; ++ I)ANS =(ANS + DP [(N- 1)%2 ] [I])%MOD。
15      のprintf(" %d個の\ n "(ANS << 1)%のMOD)。
16 }
コード

 

おすすめ

転載: www.cnblogs.com/OI-zzyy/p/11131686.html