luogu P3959(2017noipTG D2T2
多くの質問に会った二日間は、偽装マップをDPなぜ、私は知らない、とこの道はあります。
最短40分、データが実際= 12は、圧力DPように見られる<Nの範囲であり得ます。
解決:
問題は、接続方法を見つけることを意図しており、通信ポイントの同じブロックにおける最小コストこと。
N <= 12は、そうDFS + DP状の圧力を行います。
詳しくはノートを参照してください。
AC码:
書式#include <cstdioを> 書式#include <CStringの> 書式#include <アルゴリズム> 名前空間stdを使用。 整数N、M、CNT、OUT [15]、K、ANS = 1E9 + 7、E [15] [15]、DP [15] [15] [1 << 15]。 // DP [X] [D] [s]は点xの最小の総コストは、セットSの深さdであります //目標状態CNT ==(1個の<< N)-1 // OUT [i]は層の数であります 空の仕事(int型のx、int型の合計、int型の深いです) { //転送方程式DP [X] [深い] [1 <<(X-1)] =分(DP [X] [深い] [1 <<(X-1)]、和+アウト[I] * E [i]は[J]) //合計は、DPの層は、深い層に、xは現在のコレクションであるときに最適なソリューションです。 もし(合計> = ANS)のリターン; //剪定 もし(X == CNT) { ANS = I; リターン; } (I ++; I <= N I = 1の整数)のために { もし((1 <<(I-1)&X)!)続けます。 用(INT J = 1; J <= N; J ++) { (もし!((1 <<(J-1))&X)&& E [i]の[j]の<1E9 + 7) { もし(DP [J] [深い+ 1] [1 <<(J-1)| X] <=合計+アウト[I] * E [i]は[J])続けます。 DP [J] [深い+ 1] [1 <<(J-1)| X] =合計+アウト[I] * E [i]の[j]は、 アウト[j]は、[i]は1アウト=。 作業(1 <<(j-1)| X、DP [J] [深い+ 1] [1 <<(j-1)| X]、深い+ 1)。 } } } } メインint型() { scanf関数( "%D%D"、&N、&M)。 CNT =(1 << N)-1。 memsetの(E、0x3fを、はsizeof(E))。 しばらく(M--) { Uをint型、V、W; scanf関数( "%D%D%D"、&U&V、およびW) E [U] [V] = E [V] [U] =分(E [U] [V]、W)。 //追加(U、V、W);アドオン(V、U、W)。 //で[U] ++;で[V] ++; //アウト[U] ++;アウト[V] ++; //もし(アウトアウト[U]> [V] &&アウト[U]> OUT [maxu])maxu = U。 //もし(OUT [V]> OUT [U] && OUT [V]> OUT [maxu])maxu = V。 // MAXOUT = MAX(MAXOUT、MAX(OUT [U]、[V]アウト))。 } (I ++; I <= N I = 1の整数)のために { memsetの(アウト、0、はsizeof(OUT))。 memsetの(DP、0x3fを、はsizeof(DP))。 OUT [I] = 1。 //初期化 作業(1 <<(I-1)、0,0)。 } printf( "%dの\ n" は、ANS)。 0を返します。 }
DP-のようなプレスレビュー:
個人的に私は、最も重要なことのような圧力ビットコンピューティングは、圧力が通常の場合のようなバイナリ圧縮(だと思い聞いた三元、あまりにもあまりない食品)
ビット算術演算のマップが(オンラインで見つけます
ブログ、に非常に感謝し___New2zy___dalao リンクされています。
その後、圧力DPの形式の方法を選択。(個人的な経験を言うように
選択された選挙か、勝つか負ける:Nは、通常、一般的に、各点(ステップ)のための2つのケースが存在する、64超えません。
自然の残りの部分と一般的なDPと同様に(無後効果、最適ステージ)