動的計画法:逆引き参照。
1 クラスソリューション{ 2 公共 int型 findNumberOfLIS(INT [] NUMS){ 3。 INT MAXLEN = 0、RES = 0; // MAXLEN:増加サブシーケンスの最大長さ、RES:MAXLENは、サブシーケンスの数をインクリメントする 4。 INT N- = nums.length; 5。 // DP [K] [0]:NUMSで[k]はテール配列の最大長さである 6。 // DP [K] [1]:尾ためNUMSに[K]、DP [K ] [0]長いサブシーケンスの数 7 のint [] [] DP = 新しい新しい INT [N-] [2 ]; 8 用(INT K = 0; K <N-; K ++ ){ 9 DP [K] [0 ] DP = [K] [1] = 1; // 初期化 10 以下のために(INT I = 1-K。; I> = 0; i-- ){ 11 IF(NUMS [K]> NUMS [I]){ 12は、 IF(DP [I] [0] + +1> DP [K] [0]){ // 大きい長、最大長、および更新の数の存在 13は DP [K] [0] DP = [I] [0]を+1しました; 14 [1] DP [K] DP = [ I] [1。]; 15 } 16 他 IF(DP [I] [0] == DP + 1 [K] [0 ]){ 17。 DP [K] [1] + DP = [I] [1]。// 同じ最大長の存在下、全長の最大数 18 } 19 } 20 } 21れる IF(MAXLEN <DP [K] [0])MAXLEN DP = [K] [0]; // の最大長記録 22である } 23がある ため(INT [] NUM:DP)RES NUM = [0] == MAXLEN? NUM + RES [1]:RES; // の最大長さの合計数を計算 24の 戻りRESを; 25 } 26です }
P