[圧縮アルゴリズム]状態DP

DPは、どのような圧縮の状態ですか?

A:使用は、演算ビット(加算、減算、ほぼ以上のコンピューティングビット!)状態、及び動的プログラミングを記録します。

何が問題に適用されますか?

A:データ小さく、あなたが解決するための単純なアルゴリズムを使用することはできません。

 

例:

タイトル説明

キャンディショップのオーナー、キャンディのMフレーバーの合計が販売します。説明の便宜のために、我々は、Mは、第1〜Mを味う
スティーブは、すべての味のお菓子を味わいたいです。残念ながら、上司は一人でお菓子を販売したが、販売用パッケージ全体のパックのK個ません。
ご購入前にボブは、すべてのパックでお菓子の味を知ることができるので、幸いなことに、の味は、キャンディーの包み紙のキャンディーのK個を指摘しています。
お菓子のNパケットを考えると、あなたは、少なくともいくつかのパックを購入する暁明を計算し、あなたはお菓子のすべての味を楽しむことができます。

エントリー

最初の行は三つの整数N、MとKを含んでいます
次のN行およびKキャンディ味のパケットを表すT1、T2、...、TKの整数。
1 <= N <= 100,1 < = M <= 20,1 <= K <= 20,1 <= Tiの<= M.

輸出

答えを表す整数。ボブは、すべての味を味わうことができない場合は、出力-1。

サンプル入力 

6 5 3 
1 1 2 
1 2 3 
1 1 3 
2 3 5 
5 4 2 
5 1 2

サンプル出力

2

データは、それが圧縮DPの状態に適しており、小型です。

次のようにアイデアは以下のとおりです。

バイナリ1とゼロでキャンディの特定の種類の有無を表現します。例えば、上記の例によれば、キャンディの5種類の合計。第二ライン112は00011であり、第三の線123は、00 111で、最後の行512は、10011であり、...

その後、我々は、これらの状態で、DPストレージアレイを使用します。

INT DP [ 1 << M]。

各ラインの読み取りのために、それはキャンディーのこれらのタイプを購入することができますパックを購入表す、対応する要素を割り当てますに-1に初期化されています。

次のようにACコードは次のとおりです。

1の#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3  
4  int型のmain(){
 5      INT N、M、K、S、SS。
6      CIN >> N >> M >> K。
7      INT DP [ 1 << 20 ]。
8件の     INT商品[ 100 ]。
9      のmemset(DP、 - 1はsizeof (DP))。
10      のためにINT J = 0 ; J <nであり、j ++ ){
 11の          SS = 0 12          のためのINTは私= 0 ; I <K; I ++ ){
 13              CIN >> S。
14の              SS | =(1 <<(S - 1 ))。
15          }
 16          商品[J] = SS。
17          DP [SS] = 1 18      }
 19      のためにINT iは= 0、n iは<; I ++ ){
 20          のためにINT J = 0 ; J <(1 << M)は、J ++ ){
 21の             場合(DP [J] == -1続けます22              もし(DP [J |商品[I]] == - 1 23                  DP [J | 商品[I] = DP [J] + DP [商品[I]]。
24              
25                  DP [J | 商品[I] =分(DP [J] + DP [商品[I]、DP [J | 商品[I])。
26          }
 27      }
 28      COUT << DP [(1 << M) - 1 ]。
29 }

 

おすすめ

転載: www.cnblogs.com/zyyz1126/p/12377491.html