// 最後の番号は、-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 。 }