895上昇最長のシーケンスをAcWing

// 最後の番号は、-1 I、分類ビットに最初のi番目の配列を、上昇するように設定されている
 @ I-1は、配列インデックスであってもよいことができない添字2、1
 / / I-1であったインデックス番号に 
する#include <iostreamの> 
する#include <アルゴリズム>
 使用して 名前空間STDを、
 CONST  INT N = 1010 ;
 INT N-;
 INT [N]、F [N];
 int型のmain(){
    scanf関数(" %のD "、&N)
    以下のためにINT iが= 1 ; I <= N; I ++)のscanf(" %dの"、および[I])。
    以下のためにINT iが= 1 ; I <= N; I ++ ){
        F [I] = 1 ; // [i]の数と仮定すると起動
        するためのINT J =を1。 ; J <I、J ++ IF(A [J] <[I])// 満足が上昇 
                F [I] = MAX(F [I]、F [J] + 1 );
    }
    int型のres = 0 ;
    以下のためにINT iが= 1 ; I <= N; I ++)RES = MAX(RES、F [I])。

    printf(" %dの\ n " 、RES)。

    リターン 0 ;
}

 

 

出力パス

#include <iostreamの> 
する#include <アルゴリズム>
 使用して 名前空間STD;
 constの 整数 N = 1010 ;
 INT N-、
 INT A [N]、F [N]は、
 INT G [N]; // 転送の各々がから転送する方法店舗各転送は、それが実行する方法である   
int型{main()の
    scanf関数(" %のD "、&N)
    以下のためにINT iが= 1 ; I <= N; I ++)のscanf(" %dの"、および[I])。
    以下のためにINT iが= 1 ; I <= N; I ++ ){
        F [I] = 1 ; // [I]の数と仮定し始める 
        [I] = Gを0 ; // 0の場合、唯一の番号が存在する
        ためINT J = 1、J <I、J ++ iF(A [J] <A [I])// 満足は増大
                のiF(F [I] <F [J] + 。1 ){
                    F [I] = F [J] + 1 
                    G [I] = J; // I状態がj上の状態からの遷移です
                }
    }
    整数 K = 1 ; // インデックスは、最適なソリューションの記録
    のためにINT I = 1 ; I <= N; I ++ IF(F [K] < F [I])
            K = I。
    COUT << F [K] << ENDL; // 最大出力長
    のためのINT I = 0、LEN = [K] F、I <lenは、I ++){ // 合計F [k]が値 
        COUT << Aを[K] << "  " ; // F [k]は最初のk番目の出力ので、端部におけるk番目のシーケンス番号であるため、 
        K = G [K]; // 来る転送元
    }
     戻り 0 
}

 

おすすめ

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