LIS

题目:这是一个经典的LIS(即最长上升子序列)问题,请设计一个尽量优的解法求出序列的最长上升子序列的长度。给定一个序列A及它的长度n(长度小于等于500),请返回LIS的长度。

思路:经典dp,维护一个一维数组dp[],里面每个值代表必须以这个索引对应的序列值结尾的最长子序列,然后在dp[]里找出最大的即可。比如数组[1,4,2,3,5],生成dp[5],dp[0]先置1,dp[1]就是找4之前的比4小的那些数对应的最大dp数组的值,即1比4小,而且只有一个,所以对应dp值是最大的,即dp[0]=1,所以dp[1]=dp[0]+1=2;  再来看dp[2],2之前只有1比2小,所以dp[2]=dp[0]+1=2;  dp[3]就找3前面的比3小的数,即1和2,对应dp[0]=1,dp[2]=2,所以选择dp[2],故dp[3]=dp[2]+1=3;....一次类推,最后找出dp数组中的最大值即为所求

 public int getLIS(int[] A, int n) {
       int[] dp = new int[n];
       int res=0;
        dp[0] = 1;
        for(int i=1;i<n;i++){
            int max=0;//找比i小的值里对应dp最大的
            for(int j=0;j<i;j++){
                if(A[j]<A[i]){
                    if(max<dp[j])
                        max=dp[j];
                }
            }
            dp[i]=max+1;
        }
        //找dp中的最大值
       for(int i=0;i<n;i++){
           if(res<dp[i])
               res=dp[i];
       }
        return res;
    }
原文地址:https://www.cnblogs.com/team42/p/6734915.html