奇妙な道路 - などの圧力DP

タイトル説明

暁には、歴史の本から古代文明ということを学びました。交通機関のすべての面で、この高度に発達した文明も例外ではありません。 
考古学者は既にこの文明が全盛期番1..nの中にn個の都市を持っていることを知っています。M道路これらの都市の間の接続、道路2人の住民が便利の間とすることができるように、それぞれ接続する2つの都市、。 
都市のペア間の道路の数があるかもしれません。歴史的な記録によると、トランスポートネットワークの文明は、二つの奇妙な機能を満たすことができます。 
まず、デジタル文明崇拝Kは、それぞれ位置する二つの都市を結ぶ任意の道路、のためのでuとvは、それが満たさなければならない1 <= | U - V | <= K. 加えて、すべての都市は(0も偶数であると考えられる)だけ偶数番目の道路に接続されています。 
時間が長すぎるため、しかし、具体的な交通ネットワークが、私たちは学んでいません。 
暁には、n個の都市間のどのように多くの可能な接続方法に興味があったので、彼女はあなたになりました。  
可能な方法の多くは、あなただけの出力にデジタル・アナログ方式十億七が必要です。

100%のデータを満たす1 <= N <= 30、0 <= M <= 30、1 <= K <= 8。   

 

問題のスターター意味:N-M-点エッジ、条件を満足します

  1. 各点の偶数です。
  2. Uの頂点に接続された各エッジは、V数はKなし自己ループとの間の差を超えません。

評価%番号十億七の値を。

考え

  $ DP $タイトルの非常に神のような圧力。難易度の状態量があることを示します。まず、我々はデータの範囲を分析し、我々は$ Kは<= 8 $、およそ平和維持Kの圧縮の状態は、我々はまた、$ DP $の直接の圧力のような理由を考えることは明らかであることがわかりました。

  その後、$ $ Iは$ $ [I] [J] [S] fがあり、その後明らかにフロント点、さらにはエッジ$ J、数ik->点の状態I $ $ S $、$ S $を表しますこれは、これらの点のパリティの程度を示します。

  そして、幸せなスタートをプッシュします。エッジ状態遷移を追加することを検討。その後の後、何もそこではありません。(私はこの質問はここで停止しますやります)

  どのようにプラス側?$ iには、エンドポイントとして別のものを$?私達が私もエッジ点を$現在の$を示すために次元を追加する必要があり、この状態は$ DP $転送を満たすのに十分ではないことは明らかです。そして、頂点番号$ <= k個の$、我々は唯一、それが接続されている区間[IK、I-1] $側を考慮する必要が$ Iとの違いので。次に、$ fが存在する[I] [J] [S] [L]は前のi番目の点を示し、さらにエッジjは、[IKは、i]は、Sの状態であり、i及びIK + 1 $の現在の点の処理でもエッジ間。

  転送が(表ブラシは、ここで使用する)は、特に難しいことではありません。

  1. $ IとI-K + L不連続なリムは、[I] [J] [S] [L + 1] + = F [I] [J] [S] [L] $ Fがあります
  2. IおよびI-K + L $接続側$、Fが$ [I]、[J + 1] [S $ $ \ oplus $ $ 1 << K $ $ \ oplus $ $ 1 << L] [L] + = F [I] [J] [S] [L] $
  3. あなたが持っている必要があり、ポイントを追加することを検討します。$ IKの$度のためのポイント数でも、$ [IK、I-1] $間隔のポイントであると私はすべて転送されています

  その答えは、$ F [n]が[M] [0] [k]のN- $ $ $ M縁の$ $前方接続点、及びプロセスが$ NK + K = N個の$、$すなわちある[NKあります、N-1]は、すべてのケースで処理$。

コード

#include <ビット/ STDC ++ H.>
 使用して 名前空間STD;
 のconst  int型 P = 十億七;
 CONST  INT S = 1。 << 9。 INT F [ 35 ] [ 35 ] [S] [ 35 ];
 int型N-、M、K。
 
INT メイン()
{ 
    scanfの(" %D%D%D "、およびN-、&M、およびK); 
    F [ 2 ] [ 0 ] [ 0 ] [ 0 ] = 1 ; //は、初期化、1と2が接続されていません側は、プログラムである
    ためint型、I = 2 I ++; iが<= N; のためのINT J = 0 ; J <= Mであり、j ++ のためにINT S = 0 ; S <(1 << K + 1); S ++)//は枚举状态
    {
         ためのint型 L = 0、L <K、L ++)// 枚举I-K + L 
        { 
            F [I] [J] [S] [L + 1 ] + = F [I] [J] [S ] [L] =%P。// 不连边
            場合(I-K + L> 0 && J <M)F [I] [J + 1 ] [S ^(1 << L)^(1 << K)]、[L] + = F [I] [J] [S] [L]%= P; // でもエッジ
        }
         IF(!(S&1))F [Iが+ 。1 ] [J] [ >> S 1 ] [ 0 ] = F + [I] [J] [S] [K] =%P; // 省略IKは、加え+ I 1 
    } 
    COUT << F [N-] [M] [ 0 ] [K]; 
}

おすすめ

転載: www.cnblogs.com/THRANDUil/p/11588372.html