动态规划(五)最长递增子序列问题

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

       

原创文章 9 获赞 0 访问量 600

猜你喜欢

转载自blog.csdn.net/m0_37741420/article/details/105280236