動態規劃(五)最長遞增子序列問題

       最長遞增子序列也是常見的動態規劃問題之一,形式如下:給出一個數組,如{ 2, 5, 1, 8, 7 },求出數組中最長遞增子序列的長度。該例子中最長遞增子序列爲"2 5 8"或"2 5 7",最長遞增子序列長度爲3。

       與前面文章的分析方式類似,分析步驟如下:

           1、首先要定義狀態。在此問題中,如定義一個新的一維數組length[ ],用來存儲原數組每個位置上對應的最大遞增子序列的長度,即length[ i ]爲以數組第i+1個元素結尾時的最長遞增子序列的長度。

           2、狀態的變化。一維數組length[ ]每個具體值的填充,要基於原數組的相鄰元素值的比較。比如原數組arr[ ]值爲{1, 3, 2 },則length[ 0 ]值爲1,即默認初始值爲1。然後arr[ 0 ]與arr[ 1 ]比較,arr[ 0 ] < arr[ 1 ],所以length[ 1 ]值爲2。然後arr[ 2 ]與arr[ 1 ]、arr[ 2 ] 與 arr [ 0 ]分別進行比較,結果爲1和2,取較大值,所以length [ 2 ]的值也爲2。

          Java代碼如下:

             int[ ] arr = {2, 5, 1, 8, 7};
             int[ ] length = {1, 0, 0, 0, 0};
             //將原始數組比較後的值存進新創建的一維數組length
             for(int i = 0; i < arr.length; i++)
             {
                   length[ i ] = 1;
                   for(int j = 0; j < i; j++)
                   {
                        if(arr[ j ] < arr[ i ] && length[ j ] >= length[ i ])
                              length[ i ] = length[ j ] + 1;
                    }
              }
        
              int max = -1;
              for(int i = 0; i < arr.length; i++)
                     if(max < length[ i ])
                             max = length[ i ];
        
              System.out.println(max);

 

       

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章