JS动态规划:背包问题与最长公共子序列
请用JavaScript实现0-1背包问题和最长公共子序列(LCS)的动态规划解法,并解释状态转移方程。
回答
我是大山
function knapSack(weights, values, W) {
const n = weights.length;
const dp = new Array(W + 1).fill(0);
for (let i = 0; i < n; i++) {
for (let w = W; w >= weights[i]; w--) {
dp[w] = Math.max(dp[w], dp[w - weights[i]] + values[i]);
}
}
return dp[W];
}
function longestCommonSubsequence(s1, s2) {
const m = s1.length, n = s2.length;
const dp = Array.from({length: m+1}, () => new Array(n+1).fill(0));
for (let i = 1; i <= m; i++) {
for (let j = 1; j <= n; j++) {
if (s1[i-1] === s2[j-1]) dp[i][j] = dp[i-1][j-1] + 1;
else dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
}
}
return dp[m][n];
}
DP核心三要素:1)最优子结构;2)重叠子问题;3)状态转移方程。优化技巧:状态压缩(滚动数组)、记忆化搜索。