LeetCode #300

# Description:

Given an unsorted array of integers, find the length of longest increasing subsequence.

Your algorithm should run in O(n2) complexity.

## Example:

``````For example,
Given [10, 9, 2, 5, 3, 7, 101, 18],
The longest increasing subsequence is [2, 3, 7, 101], therefore the length is 4. Note that there may be more than one LIS combination, it is only necessary for you to return the length.
``````

# Idea:

Similar to Longest Increasing Path in Matrix, which is 2D DP. This is the 1D DP version.

Use this equation: `DP[i] = max(DP[j] + 1) for all j>i`. Then find the largest value among `DP[i]`.

# Code:

``````class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if(nums.empty()) return 0;

int n=nums.size();
vector<int> DP(n, 0);
DP[n-1]=1;

int max_len=0;
for(int i=0; i<n; ++i){
max_len = max(max_len, findLongest(nums, i, DP));
}

return max_len;
}

int findLongest(const vector<int>& nums, int i, vector<int>& DP){
if(DP[i]!=0) return DP[i];

int n=nums.size();
int longest=0;
for(int j=i+1; j<n; ++j){
if(nums[i]<nums[j])
longest = max(longest, findLongest(nums, j, DP));
}
DP[i] = longest+1;
return DP[i];
}
};
``````