diff --git a/Dynamic Programming/Longest Increasing Subsequence/LongestIncreasingSubsequence.cpp b/Dynamic Programming/Longest Increasing Subsequence/LongestIncreasingSubsequence.cpp new file mode 100644 index 0000000..e7bf6b8 --- /dev/null +++ b/Dynamic Programming/Longest Increasing Subsequence/LongestIncreasingSubsequence.cpp @@ -0,0 +1,40 @@ +// Memoization + +class Solution { +public: + + int solve(vector &nums, vector> &dp, int n, int ind, int prev){ + if(ind == n) return 0; + if(dp[ind][prev+1] != -1) return dp[ind][prev+1]; + int notTake = solve(nums, dp, n, ind+1, prev); + int take = 0; + if(prev == -1 || nums[ind] > nums[prev]) + take = 1 + solve(nums, dp, n, ind+1, ind); + return dp[ind][prev + 1] = max(take, notTake); + } + + int lengthOfLIS(vector& nums) { + int n = nums.size(); + vector> dp(n, vector(n+1, -1)); + return solve(nums, dp, n, 0, -1); + } +}; + + +// Tabulation - 1D + +class Solution { +public: + int lengthOfLIS(vector& nums) { + int n = nums.size(), maxi = INT_MIN; + vector dp(n, 1); + for(int i = 0; i < n; i++){ + for(int j = 0; j < i; j++){ + if(nums[i] > nums[j] && dp[i] < 1 + dp[j]) + dp[i] = 1 + dp[j]; + } + maxi = max(maxi, dp[i]); + } + return maxi; + } +};