Longest Increasing Subsequence

Updated:

LIS문제이다. 전통적으로 n^2으로 짜는 경우가 있지만,

lowerbound나 upperbound를 이용해서 nlogn으로 구현하는 경우도 있다

이번에는 전통적인 n^2으로 구현을 해보았다.

dp[i] : i를 오른쪽끝으로 할때, 최장 증가 부분 수열의 길이를 의미한다

그러면, 현재 위치를 j라고하자 (단 0≤j<i)이다

오른쪽으로 계속 갈수록 수가 커져야 하기에, arr[j]<arr[i]라는 조건이 필요하다

그래서 정리하면, dp[i] = max(dp[0],…dp[j],…,dp[i-1])+1(단, arr[j]<arr[i]일때 갱신 가능함)

아래의 코드를 보는게 이해에 더빠를듯하다

by Java

class Solution {
    public int lengthOfLIS(int[] arr) {
        if(arr.length==0) return 0;
        int[] dp = new int[arr.length];
        int ans=1;
        for(int i=0;i<arr.length;i++) {
            dp[i] = 1;
            for(int j=0;j<i;j++) {
                if(arr[j]<arr[i]) {
                    dp[i] = Math.max(dp[i],dp[j]+1);
                    ans = Math.max(ans,dp[i]);  
                }
            }
        }
        return ans;
    }
}

Leave a comment