class Solution {
public:
    int findNumberOfLIS(vector<int>& nums) {
        int len = nums.size(), maxLen = 0, maxNum = 0;
        
        //dp[0][i] lenght of LIS ending at i
        //dp[1][i] numbers of LISs ending at i
        vector<vector<int>> dp(2, vector<int>(len, 0));
        
        for(int i = 0; i < len; ++i)
        {
            int currLen = 1, currNum = 1;
            for(int j = 0; j < i; ++j)
            {
                if(nums[j] < nums[i])
                {
                    if(dp[0][j] + 1 > currLen)
                    {
                        currLen = dp[0][j] + 1;
                        currNum = dp[1][j];
                    }
                    else if(dp[0][j] + 1 == currLen)
                        currNum += dp[1][j];
                }
            }
            dp[0][i] = currLen;
            dp[1][i] = currNum;
            if(currLen > maxLen)
            {
                maxLen = currLen;
                maxNum = currNum;
            }
            else if(currLen == maxLen)
                maxNum += currNum;
        }
        return maxNum;
    }
};