検索最適化の剪定 - 牛オフより多くの学校を2番目のフィールドF

私は多くの重要な検索や剪定を試みたが、最終的にはより良い品質の圧力のような、まだ見つかっ

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
// の#define IO 
の#define Fiの第一
 の#define SE第二
 の#define PB一back
 の#define MK make_pair
 の#define LSON RT << 1、L、中間
 の#define rsonのRT << 1 | 1、中間+ 1、R用
 の#define担当者(I、S、T)(I = sのint型、iがTを<; I ++の)のため
 の#define REP(I、S、T)のための(I = sのint型、I <= T; I ++)は
 #defineする DOW(IをI> = T; i--)(I = Sをint型のためのS、T)
 #defineする I> T;(I = Sをint型ダウ(I、S、T)をi--)
 の#define CLR(A 、B)のmemset(A、B、はsizeof(A))
 の#defineデバッグ(X)COUT <<#1 X <<」「<< X <<
  ロングLL; 
typedefのペア < int型int型 > PII。
インラインINT lowbit(INT X){ 戻り X&( - X)。} 
テンプレート <型名T> 
インラインボイドリード(T&X){ 
    X = 0int型、F = 1チャー CH = GETCHAR()。
    一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - ')、F = -1 ; CH = GETCHAR()。}
     一方、(CH> = ' 0 ' && CH <= ' 9 '){X = X * 10 + CH- ' 0 'CH = GETCHAR()。} 
    、X * = F。
} 
のconst  int型 N = 110 
LL G [N]、[N]。
LL N、ANS。
 
ボイド DFS(int型マスク、int型 NUM、INT プリ、LL preans){
     場合(NUM << 1個の ==のN){ 
        ANS = MAX(ANS、preans)。リターン
    }
     IF(N- 1。 -pre NUM + <N- / 2リターン ;        //は(集合はN / 2元素から選択することができない)すべての後続の偶数番号が選択される表し、また条件を満たし、直接リターン(最適なプルーニング)
    のためのint型 I =プリ+ 1 ; I <N-; I ++ ){ 
        LL nowans = preans; 
        REP(J、0 、N-){
             IF(&マスク(1 << J))nowans- = G [I]、[J];
             他の nowans + = G [I]、[J]; 
        } 
        DFS(マスク |(1 << I)、NUM + 1 、I、nowans); 
    } 
} 
int型メイン(){ 
    CIN >> N - 、= N - << 1。; 
    REP(I、0、N-)REP(J、0 、N-)を読む(G [I] [J]); 
    LL nowans = 0 ;         // 今他に第一の設定点 
    REP(I、0、N-)nowans + = G [ 0 ;] [I]が
    DFS((1 << 0)、10 、nowans); 
    のprintf(" %のLLD \ N- " 、ANS);
     戻り 0 ; 
}

そして、検索の異なるアイデアは空であり、その後、要素の二組を埋めるために、それははるかに少ない冗長検索される2つのセットから始め、があります

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
#defineっ長い長
LLのN、VIS [ 30 ]、MP [ 30 ] [ 30 ]、ANS。


INT S1 [ 30 ]、S2 [ 30 ]、TOP1、TOP2。
ボイド(DFS int型今POS、LL){
     場合(POS> 2 *のN){ 
        ANS = MAX(ANS、今)。
        返します
    } 
    であれば(TOP1 < N){ 
        S1 [ ++ TOP1] = POS。
        NXT LL = 今;
        にとってint型 i = 1 ; iは= TOP2を<; iは++ 
            NXT + = 融点[POS]を[S2 [I]]; 
        DFS(POS + 1 、NXT)。
        TOP1 - ; 
    } 
    であれば(TOP2 < N){ 
        S2 [ ++ TOP2] = POS。
        NXT LL = 今;
        以下のためにint型 i = 1 ; iは= TOP1を<; iは++ 
            NXT + = 融点[POS] [S1 [I]]; 
        DFS(POS + 1 、NXT)。
        TOP2 - ; 
    } 
}

INT メイン(){ 
    CIN >> N。
    以下のためにint型 i = 1 ; iが<= 2 * N; I ++ のためのINT J = 1 ; J <= 2 * N; J ++ 
            のscanf(" %dの"、およびMP [I] [J])。
    ANS = 0 ; 
    DFS(10 ); 
    coutの << ANS << てendl; 
} 
/ * 
(28,14)= 
* /

 

おすすめ

転載: www.cnblogs.com/zsben991126/p/11287855.html