Complete-Preparation

🎉 One-stop destination for all your technical interview Preparation 🎉

View the Project on GitHub

Longest Increasing Subsequence 🌟🌟

Recursive solution

Code

int f(int* arr, int n, int ind, int prevInd)
{
    if (ind == n) {
        return 0;
    }
    int notTake = f(arr, n, ind + 1, prevInd);
    int take = 0;
    if (prevInd == -1 || arr[ind] > arr[prevInd]) {
        take = 1 + f(arr, n, ind + 1, ind);
    }
    return max(take, notTake);
}

int longestIncreasingSubsequence(int arr[], int n)
{
    return f(arr, n, 0, -1);
}

Memoization(top-down)

Code

int f(int* arr, int n, int ind, int prevInd, vector<vector<int>>& dp)
{
    if (ind == n) {
        return 0;
    }
    if (dp[ind][prevInd + 1] != -1) {
        return dp[ind][prevInd + 1];
    }
    int notTake = f(arr, n, ind + 1, prevInd, dp);
    int take = 0;
    if (prevInd == -1 || arr[ind] > arr[prevInd]) {
        take = 1 + f(arr, n, ind + 1, ind, dp);
    }
    return dp[ind][prevInd + 1] = max(take, notTake);
}

int longestIncreasingSubsequence(int arr[], int n)
{
    vector<vector<int>> dp(n, vector<int>(n + 1, -1));
    return f(arr, n, 0, -1, dp);
}