羅区P5569 [SDOI2008]石がマージアルゴリズムGarsiaWachs

石の合併究極のユニバーサル版

#include <ビット/ STDC ++ H.>
 使用して 名前空間STD;
 INT石[ 50010 ];
 int型N-、T、ANS;
 ボイドコンバイン(int型K){
     int型 TEM石= [K] +石[ - K- 1 ]; // 合わせスタックK及びK-1 
    ANS = + TEM;
     のためのINT I = K; I <T- 1。 ; I ++)ストーン[I] =石[I + 1 ]; // kは順方向シフト後 
    T--をINT J;
     のため(= - K-J 1、J> 0 &&ストーン[J- 1。<TEM; J)ストーン[J] =ストーン[J- 1 ]; // Kバック1シフト後、TEMより位置大きい見つけること。 
    石[J] = TEMを; // Jに挿入TEM 
    一方(J> = 2 &&石[J- 2 ] <=石[J]){ // 再帰処理で得られた新たなシーケンス
        INT ; D = TJ // バックトラッキングのために。
        結合(J- 1 ); 
        J = TD; // バック
    } 
} 
int型のmain(){
     ながら(〜scanfの(" %のD "、およびN-)){
         IF(N - == 0BREAK 以下のためにINT iが= 0、I <N; I ++)のscanf(" %dの"、&石[I])。
        T = 1 
        ANS = 0 ;
        以下のためにINT iが= 1、N iが<; I ++ ){ 
            石[T ++] = 石[I]。
            一方、(T> = 3 &&石[T- 3 ] <=石[T- 1 ])(T-組み合わせる2)。// 从1开始遍历到结尾
        }
         ながら(T> 1)(T-組み合わせます1); // そうでない場合は最初の再結合した後、スタックに合わせ 
        のprintf(" %D \ N- " 、ANSは); 
    } 
    戻り 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/QingyuYYYYY/p/11894863.html