最长递增子序列也是常见的动态规划问题之一,形式如下:给出一个数组,如{ 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);