長い長いを開くには注意してください
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #defineは長い長いっ たLL DP [ 1 << 18 ] [ 18 ]。 LLのE [ 20 ] [ 20 ]。 LL X [ 20 ]、Y [ 20 ]。 constの LL INF = 1E18; INT のmain() { int型N、S。 scanf関数(" %D%dの"、&N、&S)。 int型 TOT = 0 ; 以下のために(int型 i = 1 ; iが<= N; iは++します) { LL、B; scanf関数(" %のLLDの%のLLD "、&、&B)。 場合(S == I) { X [N - 1 ] = 。 Y [N - 1 ] = B; } 他 { X [TOTは] = 。 Y [TOT] = B。 TOT ++ ; } } のために(int型 i = 0 ; iはTOT <; iは++ ) のために(INT J = 0 ; J <TOT。J ++ ) { E [I] [J] = ABS(X [I] -x [J])+ ABS(Y [I] - Y [J])。 } のための(INT S = 0 ; S <(1回の << TOT); S ++ ) のために(int型 i = 0 ; iはTOT <; iは++ ) DP [S] [I] = INF。 用(int型 I = 0 ; iがTOTを<Iは++ ) DP [ 1 << i]は[I] = ABS(X [I] -x [N- 1 ])+ ABS(Y [I] -y [N- 1 ])。 以下のための( int型 S = 0 ; S <(1 << TOT); sが++ ) のために(int型 i = 0 ; iがTOT <; I ++ ) のための(INT J = 0 ; J <TOT; J ++ ) { もし!(I = J &&( (1 << I)&S)&&(((1 << J)&S)== 0 )) { DP [S | 1 << J] [J] =分(DP [S | 1 << J] [J]、DP [S] [I] + E [I] [J])。 } } LL ANS = INF。 (int型 i = 0 ; iはTOT <; iは++ ) { ANS =分(ANS、DP [(1回の << TOT) - 1 ] [I])。 // のprintf( "%d個の\ n"、DP [(1回の<< TOT)-1] [I])。 } のprintf(" %のLLD " 、ANS)。 }