🎉 One-stop destination for all your technical interview Preparation 🎉
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);
}
prevIndex
will be prevIndex+1
(1 based indexing).n
is 10^5
so dp array size will be 10^10
which is huge.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);
}