テンプレートの圧縮状態2:数値から選択

これは、Word、実際にテンプレートやトピックに関する質問ならば、第二ステンシル質問です

この質問は、実際にバイナリ思考は、我々はかつて我々がバイナリに変換する必要がある番号を入れている場合ので、より明白に反射して、決定する一つ一つ、これは本当に、本当に素晴らしいと同じように、私は私が話すと思われますされ合格する可能性は低い、直接バーコードを置きます

だから、コードを直接見て、それ

1の#include <cstdioを>
 2の#include <CStringの>
 3の#include <cstdlib>
 4の#include <アルゴリズム>
 5の#include <cmath>
 6の#include <iostreamの>
 7。 使用した 名前空間STD;
 8  INT F [ 16 ] [ 1 < < 15 ]; / * 圧縮の状態、バイナリ* / 
9  INT [ 16 ] [ 16 ]、Vの[ 1。 << 15 ]、VN、ビン[ 16 ]、N-;
 10  / * 2のビン数記録パワー* / 
11  INTメイン()
 12は 、{
 13は      ビン[ 1。 =] 1。 ; / * 前処理、2 0番目* / 
14      のためにint型 I = 2 ;私は= < 15は、I ++の)ビンを[I] =ビン[I- 1。 ] << 1 ; / * 前処理数が2のべき乗である* / 
15      scanfの(" %のD "、およびN-);
 16      INT I = 1 ; I <= N; I ++)のためのINT J = 。1 ; J <= N; J ++)scanfの(" %のD "、&[I] [J]);
 17。     INTマックス=(1 << N-) - 1 ; / * 2-N- ^ 1、測位演算* / 
18である      VN = 0 ; / * 各ラインがどのように多くのトピックを満たす条件を表します数* / 
19      のmemset(F、0はsizeof (F));
 20      のためのint型 X- = 0 ; X - <= MAXX; X - ++)/ * 、私は非常に多くを持って使用できないなど、私たちはに分割することができますバイナリ、* / 
21      / * このような(選択のための1)として 
 22で     1左00001011000
 である23を     上記&再び00010110000、重複が存在しないと判定された
 24      の重複がある場合、1が返され、0でない 
 25     00000010000
 26は、     私たちは、同時に選択されていない。このことを証明する必要が
 27を     、例えば、また
 28      左00001001000
 29      00.01001のない繰り返しが存在しないかを決定することである再&上記億
 30の     結果00000000000&ポスト
 31を     、従って、これら二つの説明が交差していないが我々が説明できるように、それらの両方が同時に選択されていない 
 32      * / 
33である     {
 34は         IF(((X << 1)・X)== 0/ * 分析隣接同時にそこ選択されます* / 
35          {
 36              のためにint型私は= 1 ; Iは<= nであり; Iは++)/ * 各列が持つN * / 
37 [              {
 38は                 IF(ビン[I]&X)ただし、f [ 1。 [X] + = A] [ 1。[I]];
 39                  / *が選択され、我々はこの数値が内部この再帰fを追加置く
 40                  本xは状態の数の和の内側に配置されている* / 
41である             }
 42が              V [VN ++] = X; / * これは正当場合であるので、我々は再び用CAN以下、追加* / 
43である         }
 44である     }
 45の     ためのINT = I 2、I <= N - 、Iは++)/ * すなわち、第2行から始まるように、第1行は、処理が終了した* / 
46である     {
 47          のためにINT P = 1 ; P <= VN; P ++)/ * 列挙あたり法的ケース* /
48          {
 49              INT TT = 0 ;
 50              INT J = 1。 ; J <= N; J ++)IF(ビン[J]とV [P])TT + = A [I]、[J];
 51である             * / 
52がされている             置きます:私たちは、この状態を選択し、場合合計カナダのTTはその中に、この状態はの例満たすことができる
 53              2が同時に隣接する選択されていない1.
 54              2.他の隣接する8つの方向が選択できない
 55              TTは、内側にリストに追加さ 
 56である             * / 
57がある             ためにint型 Q = 1。 ; Q <= VN; Q ++)/ * その後、再び、私たちの前の行のための配置の種類、であるために
 58              我々は今、二行あり、ので、ここで最初の行がある* / 
59             {
 60                  IF((V [P]およびV [Q])== 0 &&(V [Q] << 1&V [P])== 0 &&(V [Q] >> 1&V [P])== 0 61                  / * 数値は、1以上の条件が満たされた
 62                    上の二つの隣接数がオフチェックされていない2,3。その* / 
63である                      F [I] [V [P] = MAX( F [I] [V [P]、TT + F [I- 1 ] [V [Q]]);
 64                      / * この値を更新し、元であるF [I-1] [V [Q] プラスTT(値は、現在の行番号を選択している)
 65                      を再度、私はFであった[I] [V [P ]] 比較的大きな* / 
66              }
 67          }
 68      }
 69      INT ANS =0 ;
70      のためにint型 I = 1 ; I <= VN; I ++)はANS = MAX(ANS、[V [i]は] [n]のF)。
71      のprintf(" %d個の\ n " 、ANS)。
72      リターン 0 ;
73 }

 

おすすめ

転載: www.cnblogs.com/Tristanjiang/p/11458449.html