673(動的プログラミング)最長増加サブシーケンスの数

動的計画法:逆引き参照。

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

おすすめ

転載: www.cnblogs.com/NiBosS/p/12080716.html