🎉 One-stop destination for all your technical interview Preparation 🎉
int longestIncreasingSubsequence(int arr[], int n)
{
vector<vector<int>> dp(n + 1, vector<int>(n + 1, 0));
for (int ind = n - 1; ind >= 0; ind--) {
for (int prevInd = ind - 1; prevInd >= -1; prevInd--) {
int notTake = dp[ind + 1][prevInd + 1];
int take = 0;
if (prevInd == -1 || arr[ind] > arr[prevInd]) {
take = 1 + dp[ind + 1][ind + 1];
}
dp[ind][prevInd + 1] = max(take, notTake);
}
}
return dp[0][0];
}
int longestIncreasingSubsequence(int arr[], int n)
{
vector<int> next(n + 1, 0);
vector<int> curr(n + 1, 0);
for (int ind = n - 1; ind >= 0; ind--) {
for (int prevInd = ind - 1; prevInd >= -1; prevInd--) {
int notTake = next[prevInd + 1];
int take = 0;
if (prevInd == -1 || arr[ind] > arr[prevInd]) {
take = 1 + next[ind + 1];
}
curr[prevInd + 1] = max(take, notTake);
}
next = curr;
}
return next[0];
}
dp[i]
represents the length of the longest increasing subsequence ending at index i.1
to dp[prev]
. store max in dp[i]
.int longestIncreasingSubsequence(int arr[], int n)
{
vector<int> dp(n, 1);
int ans = 1;
for (int i = 0; i < n; i++) {
for(int prev = 0; prev < i; prev++){
if(arr[prev] < arr[i]){
dp[i] = max(dp[i], dp[prev] + 1);
}
}
ans = max(ans, dp[i]);
}
return ans;
}
int longestIncreasingSubsequence(int arr[], int n)
{
vector<int> dp(n, 1),idxHash(n);
int ans = 1, lastIdx = 0;
for (int i = 0; i < n; i++) {
idxHash[i] = i;
for(int prev = 0; prev < i; prev++){
if(arr[prev] < arr[i]){
// dp[i] = max(dp[i], dp[prev] + 1);
if(dp[prev] + 1 > dp[i]){
dp[i] = dp[prev] + 1;
idxHash[i] = prev;
}
}
}
// ans = max(ans, dp[i]);
if(dp[i] > ans){
ans = dp[i];
lastIdx = i;
}
}
vector<int> lis;
lis.push_back(arr[lastIdx]);
while(lastIdx != idxHash[lastIdx]){
lastIdx = idxHash[lastIdx];
lis.push_back(arr[lastIdx]);
}
reverse(lis.begin(), lis.end());
for(int i = 0; i < lis.size(); i++){
cout << lis[i] << " ";
}
return ans;
}