スタック学習アルゴリズム_

調査基準としてブルーブック、学習の積み重ね

例1:

スタック、支持プッシュを実現するために、ポップとGetMin(最小値クエリースタック)(1)Oで完了する

:思考アルゴリズムの
2つのスタックの最小値は、確立された、各データの先頭にスタックの底部に記憶された記憶された元データ、B

B.でプッシュ(X)、AにおけるXが挿入され、挿入された分(スタックデータB、X)GetMinは出力のみB.top()缶を実行する必要があります

2例:

 

 

入力
8 
I 2 
I -1 
I 1 
Q 3 
L 
D 
R 
Q 2 
出力
2 
3

 

スタックアルゴリズム//の上部
の#include <ビット/ STDC ++ H.> 
使用して名前空間STD; 
CONST INT = INF -0x3F3F3F3F; 
CONST INT MAXN = 1000010; 
// INT S1 [MAXN]; 
// INT S2 [MAXN]; 
int型SUM 【MAXN]; //数xの前と
のint F [MAXN]; //最大連続フロントの数であり、x 
INTのmain(){ 
    int型CAS; 一方(scanfの( "%のD"、およびCAS)EOF = ){ 
        memsetの(SUM、0、はsizeof(SUM)); 
        のmemset(F、INF、はsizeof F); 
        INT POS1 = 0; 
        // INT POS2 = 0; 
        スタック<整数> S1、
        スタック<整数> S2; 
        一方( cas--){ 
            文字列s、
            s.resize(5); 
            scanfの( "%のS"、&S [0]); 
            IF(S [0] == '私') {
                // cinを>> S1 [++ POS1]。
                int型温度; 
                scanf関数( "%dの"、および温度)。
                // coutの<< 666 << "" <<一時<<てendl; 
                s1.push(TEMP)。
                POS1 ++; 
                和[POS1] =和[POS1 - 1] + TEMP。
                F [POS1] = MAX(F [POS1 - 1]、和[POS1])。
                // COUT << POS1 << "III" << F [POS1] << ENDL。
            } 
            そうであれば(S [0] == 'D'){ 
                // pos1--。
                (s1.empty())であれば
                    、継続 
                pos1--; 
                s1.pop(); 
            } 
                であれば(S1。 
                //もし(!POS1 = 0){ 
                // S2 [++ POS2] = S1 [pos1--]。
                //} 
                pos1--。
                INTのTEMP = s1.top()。
                s1.pop(); 
                s2.push(TEMP)。
            } 
            他(S [0] == 'R'){もし
                あれば(s2.empty()!){ 
                    // S1 [++ POS1] = S2 [pos2--]。
                    //和[POS1] =和[POS1 - 1] + S1 [POS1]。
                    // F [POS1] = MAX(F [POS1 - 1]、和[POS1])。
                    INTのTEMP = s2.top()。
                    s2.pop(); 
                    s1.push(TEMP)。
                    POS1 ++; 
                    和[POS1] =和[POS1 - 1] + TEMP。
                    F [POS1] = MAX(F [POS1 - 1]、和[POS1])。
                } 
            } 
            そうであれば(S [0] == 'Q'){ 
                int型のX; 
                scanf関数( "%のD"、&x)は、
                printf( "%dの\ n"は、F [X])。
            } 
        } 
    } 
}

 例3:スタックの一連の問題とアウト

 

 カタラン数は、理論的な計算の数は、知識を必要とする計算C(2N、N)/(N + 1)を用いて定義されます。

#include <ビット/ STDC ++ H> 
名前空間STDを使用して、
以下のための#defineモミ(I、B)(INT iが=; I <= B; I ++)
の#define LL長い長い
CONST LL M = 1E9; // M为压位的最大值
LL A [60004] L、和[120004]。
int型のn; 
無効プライム(int型B、INT F)
{ 
    のために(int型J = 2; J * J <= B && B = 1;!J ++)//质因数分解。
        (B%以下J == 0)、一方
        { 
            和[J] + = F。
            B / = J; 
        } 
    IF(B)
        の合計[B] + = F。
} 
ボイド高(LL C)
{ 
    (I ++; I <= L INT iが= 1)のための
        [I] * = C。
    以下のために(INT I = 1; I <= L; I ++)
        [I + 1] + = [I] / M [i]の%= M; //我们需要压缩位置快速处理
    一方([L +1])
        + +1。 
} 
のIntメイン()
{ 
    A [1] = 1、L = 1、。。
    scanfの( "%のD"、およびN-); 
    のための(INT I = 1; I <= N; I ++)は、分割された2つのための組み合わせの//数、我々はこの質問に対処するために、高速な素因数分解法を使用します。
        プライム(N-I + ,. 1); 
    のため(int型I = 2; I <= N + 1; I ++)
        首相(I、-1); 
    用(INT I = 2; I <= N-2 *、I ++)
        のための(LL J = 0; J <SUM [I]; J ++)
            高(I); //精度
    のprintf( "%のLLD"、 A [L]); 
    Iは、L-LLを=(1; I; - I)
        のprintf( "%の09lld"、A [I]); //出力
    戻り0; 
}

 例IV:

 

PS:私は(気持ち形而上学エラーという)間違っているアルゴリズム上の別の日の調査研究を==持っています

 

// //の#include <ビット/ STDC ++ H> 
//の#include <cstdioを> 
//の#include <アルゴリズム> 
//名前空間stdを使用。
// typedefの長い長いLL。
// constのint型MAXN = 100010; 
// LL [MAXN]。
// int型のmain(){ 
// INT N。
//一方((scanf関数( "%のD"、&N)= EOF)&& N!){ 
(のsizeof、0)//のmemset。
//ため(INT iが= 0、I <N; ++ I){ 
//のscanf( "%のLLD"、および[I])。
//} 
// LL P。
// [N + 1] = P = 0。
// LL S [MAXN]; LL W [MAXN]。
// S [0] = [0]。
// W [0] = 1; 
        
// LL ANS = 0; 
//(INT iについては、= 1; I <= N + 1。
//もし([I]> S [P]){
// S [++ P] = [I]。
// [P] = 1ワット。
//} 
//他{ 
// LL幅= 0。
//一方、(S [P]> [I]){ 
//幅+ = [P] W。
// ANS = MAX(ANS、(LL)幅* S [P])。
// - P; 
//} 
// S [++ P] = [I]。
// [P]、W =幅+ 1。
//} 
//}   
//のprintf( "%のLD \ n"は、ANS)。
//} 
//} 
の#include <iostreamの> 
する#include <cstdioを> 
する#include <スタック> 
名前空間STDを使用して、
 
長い長いLLのtypedef。
 
CONST LL MAXN = 1E6 + 5。
 
スタック<整数>秒; 
整数nは、X。
LL [MAXN]、M、ANS、右[MAXN]、左[MAXN]。
 
INTメイン(){ 
    ながら(〜のscanf( "%d個"、&n)は、N){ 
        ANS = 0。
        [0] = -1。
        [N + 1] = -1。
        {(; I <= N I ++ iは1 = LL)のため
            のscanf( "%のLLD"、および[I])。
        } 
        ながら(!s.empty()){ 
            s.pop()。
        } 
        //从左向右
        s.push(0)。
        以下のための(iは= LL 1、I <= N; I ++){ 
            ための(X = s.top(); [X]> = [I]; X = s.top()){ 
                s.pop() ; 
            }
            左側の[I] = X + 1。
            s.push(I);
        } 
 
        ながら(!s.empty()){ 
            s.pop()。
        } 
        //从右至左
        s.push(N + 1)。
        以下のための(iはN = INT; I> 0; i--){ 
            ため(X = s.top(); [X]> = [I]; X = s.top()){ 
                s.pop( ); 
            } 
            右[I] = X - 1。
            s.push(I); 
            IF((右[I] -左[I] + 1)* [I]> ANS){ 
                ANS =(右[I] -左[I] + 1)* [I]。
            } 
        } 
 
        のprintf( "%のLLD \ n"は、ANS)。
 
    } 
    0を返します。
}

 

おすすめ

転載: www.cnblogs.com/lightac/p/12571165.html