当时难以理解的动态规划
var arr = [10, -5, 0, -2];
var dp =[]
for (let index = 0; index < arr.length; index++) {
dp.push([])
}
dp[0] = [arr[0], arr[0]];
// dp[1] = arr[1];
let max = Math.max(arr[0], arr[1]);
for (let j = 1; j < arr.length; j++) {
dp[j][0] = Math.max(dp[j - 1][0] * arr[j], arr[j], dp[j - 1][1] * arr[j]);
dp[j][1] = Math.min(dp[j - 1][0] * arr[j], arr[j], dp[j - 1][1] * arr[j]);
max = Math.max(dp[j][0], max);
}
console.log(dp);
核心思想:
在当前一个状态下 这个状态是负的那么就选之前比较小的来乘,反之就选最大的来乘 ,一步一步的把最大最小的状态累计,同时计算出较大的状态。
附一个完全平方数
let n = 12;
let dp = new Array(n + 1).fill(0);
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
for (let i = 3; i <= n; i++) {
let temp = Infinity;
for (let j = 1; j <= Math.sqrt(i); j++) {
temp = Math.min(1 + dp[i - j * j], temp);
}
dp[i] = temp;
}
console.log(dp);