ダイナミック企画スペシャル - 解決のレポート

 

 

DPを押す形

長い長いを開くには注意してください

#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)。
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/dongdong25800/p/11145088.html