最長遞增子序列也是常見的動態規劃問題之一,形式如下:給出一個數組,如{ 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);