[算法解腻]-动态规划

49 阅读1分钟

一、最少硬币

function coinsChange(coins, amount) {
  const dp = new Array(amount + 1).fill(amount + 1);
  dp[0] = 0;
  
  for (let i = 1; i < amount + 1; i++) {
     for (let j = 0; j < coins.length; j++) {
        if (i >= coins[j]) {
           dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1);
        }
     }
  }
  
  return dp[amount] > amount ? -1 : dp[amount];
}

二、路径

const uniquePaths = (m, n) => {
  const dp = new Array(m).fill(0).map(item => new Array(n).fill(0));
  for (let i = 0; i < m; i++) {
    dp[i][0] = 1;
  }
  for (let j = 0; i < n; j++) {
    dp[0][j] = 1;
  }
  
  for (let k = 1; k < m; k++) {
    for (let q = 1; q < n; q++) {
       dp[k][q] = dp[k - 1][q] + dp[k][q-1];
    }
  }
  
  return dp[m-1][n-1];
}

三、获取给定数组连续元素累加最大值

const maxSubArray = (array) => {
    let base = array[0];
    let max = array[0];
    const len = array.length;
    for (let i = 1; i < len; i++) {
       base = Math.max(base + array[i], array[i]);
       max = Math.max(base, max);
    }
    return max;
};