A set of problems that can be solved using Dynamic Programming

Maximum Subarray (https://leetcode.com/problems/maximum-subarray/)

Solved using Kadanes algorithm

/**
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function(nums) { 
    let maxSoFar = nums[0];
    let minSoFar = nums[0];
    let maxEndingHere = 0;
    
    for (let i=0; i<nums.length; i++) {
        maxEndingHere = maxEndingHere + nums[i];
        if (maxSoFar < maxEndingHere) {
            maxSoFar = maxEndingHere;
        } 
        if (maxEndingHere < 0) {
            maxEndingHere = 0;
        }
    }
    return maxSoFar;
};

Maximum product subarray: https://leetcode.com/problems/maximum-product-subarray/

A more challenging problem can be solved using min and max variables so far and flipping them each time we will meet a minus value in the array.

/**
 * @param {number[]} nums
 * @return {number}
 */
var maxProduct = function(nums) {
    let maxProduct = nums[0];
    let maxSoFar = nums[0];
    let minSoFar = nums[0];
    
    for (let i=1; i< nums.length; i++) {
        if (nums[i] < 0) { //swap
            let temp = minSoFar;
            minSoFar = maxSoFar;
            maxSoFar = temp;
        }
        
        minSoFar = Math.min(nums[i], minSoFar * nums[i]);
        maxSoFar = Math.max(nums[i], maxSoFar * nums[i]);
        
        maxProduct = Math.max(maxSoFar, maxProduct);
        
    }
    return maxProduct;
};