How to determine the longest increasing subsequence using dynamic programming?

前端 未结 19 2342
醉梦人生
醉梦人生 2020-11-22 10:55

I have a set of integers. I want to find the longest increasing subsequence of that set using dynamic programming.

19条回答
  •  名媛妹妹
    2020-11-22 11:24

    Here's another O(n^2) JAVA implementation. No recursion/memoization to generate the actual subsequence. Just a string array that stores the actual LIS at every stage and an array to store the length of the LIS for each element. Pretty darn easy. Have a look:

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    
    /**
     * Created by Shreyans on 4/16/2015
     */
    
    class LNG_INC_SUB//Longest Increasing Subsequence
    {
        public static void main(String[] args) throws Exception
        {
            BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
            System.out.println("Enter Numbers Separated by Spaces to find their LIS\n");
            String[] s1=br.readLine().split(" ");
            int n=s1.length;
            int[] a=new int[n];//Array actual of Numbers
            String []ls=new String[n];// Array of Strings to maintain LIS for every element
            for(int i=0;i=0;j--)
                {
                    //First check if number at index j is less than num at i.
                    // Second the length of that DP should be greater than dp[i]
                    // -1 since dp of previous could also be one. So we compare the dp[i] as empty initially
                    if(a[j]dp[i]-1)
                    {
                        dp[i]=dp[j]+1;//Assigning temp length of LIS. There may come along a bigger LIS of a future a[j]
                        x=ls[j];//Assigning temp LIS of a[j]. Will append a[i] later on
                    }
                }
                x+=(" "+a[i]);
                ls[i]=x;
                if(dp[i]>max)
                {
                    max=dp[i];
                    seq=ls[i];
                }
            }
            System.out.println("Length of LIS is: " + max + "\nThe Sequence is: " + seq);
        }
    }
    

    Code in action: http://ideone.com/sBiOQx

提交回复
热议问题