私は多くの重要な検索や剪定を試みたが、最終的にはより良い品質の圧力のような、まだ見つかっ
#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 = 0。int型、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)、1、0 、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(1、0 ); coutの << ANS << てendl; } / * (28,14)= * /