![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
非让我改名字
这个作者很懒,什么都没留下…
展开
-
最长连续递增子序列
给一个数字数组,给出连续递增的最大长度。(相邻的相等算1) // 空间O(1) 时间O(n) function h(arr){ let res = 1 let max = 1 for (let i = 1;i < arr.length; i++) { if(arr[i] > arr[i-1]){ res ++ }else if(arr[i] === arr[i-1]){ continue }else{ max =Math.max(res,max) re原创 2021-10-21 21:56:04 · 42 阅读 · 0 评论 -
刷房子最小花费
房子1 房子2 … 红 14 11+min(2,11) … 蓝 2 14+min(14,11) … 绿 11 5+min(14,2) … 维护一个二维数组 res,res[i][j]表示该房子染某种颜色需要的最少钱。初始化房子一的三种颜色,之后房子二染红色需要的钱为min(房子一染蓝,房子一染绿)+房子二染红,以此类推。 function h(cost, n){ let res = [] res[0] = new Array(n) res[1] = new Array(...原创 2021-10-21 18:25:24 · 44 阅读 · 0 评论 -
青蛙跳石头
创建数组 f[i] 表示青蛙是否能够跳到石头 i,初始时 f[0] = true,依次计算 f[i]。 青蛙能否跳到石头 i,需要找到从石头 0 到石头 i-1 中是否存在石头 j ,青蛙能跳到石头 j 并且能从石头 j 跳到石头 i。 function frog(arr){ const length = arr.length if(!arr || length === 0){ return false } let res = new Array(length).fill(false) re.原创 2021-10-21 12:19:16 · 315 阅读 · 0 评论 -
最小编辑长度
最小编辑长度 给两个字符串 raple 和 apple,通过对字符串1做增删改操作,使其变为字符串2,求最少的操作次数。本例中,对 raple 删掉 r 再增加 p 就可以变为字符串2,需要两次操作即可。 首先用两个指针指向两字符串尾 若当前两指针指向的字符相同,则均向前移一位 两指针指向的字符不同 那么可以对字符串1做三种操作来匹配字符串2 (1) 替换:直接将i指向的字符替换为j指向的字符。之后将两指针均前移一位。 (2) 插入:在 i 指向的字符后面插入 j 指向的字符,所以 i 后面的原创 2021-09-24 12:45:41 · 56 阅读 · 0 评论 -
背包最大价值问题
背包最大价值问题 有容量为 4 的背包,有三个物品,属性用两个数组分别表示每个物品的体积和价值 vol=[2,1,3]val=[4,2,3] vol = [2, 1, 3]\\ val = [4, 2, 3] vol=[2,1,3]val=[4,2,3] 求背包能装下的最大价值 定义二维数组 let vol = [2, 1, 3]; let val = [4, 2, 3]; function dp(S, i) { if (i === 0) { if (S >= 2) { // 能装原创 2021-09-23 11:37:07 · 374 阅读 · 0 评论 -
斐波那契数列
斐波那契数列 求斐波那契数列 1,1,2,3,5,8,13,21,34...... 的第 n 项 function fib(n) { let arr = new Array(n + 1).fill(0); return handle(arr, n); } function handle(arr, n) { if (n === 1 || n === 2) { return (arr[n] = 1); } if (arr[n]) { return arr[n]; } e原创 2021-09-22 17:54:53 · 57 阅读 · 0 评论 -
硬币凑金额
硬币凑金额 有 2、5、7 三种面额的硬币,求凑出金额为 28 需要的最小硬币数 想要凑出 27,可以凑出 25 再加一个 2 的;或凑出 22 再加一个 5 的;或凑出 20 再加一个 7 的,以此类推。 dp(S)=min(dp(S−2)+1,dp(S−5)+1,dp(S−7)+1) dp(S) = min(dp(S-2)+1, dp(S-5)+1, dp(S-7)+1) dp(S)=min(dp(S−2)+1,dp(S−5)+1,dp(S−7)+1) function dp(S) { if (S原创 2021-09-22 17:08:23 · 114 阅读 · 0 评论 -
数组中是否存在元素值和为某值
给一个数组arr = [3, 34, 4, 12, 5, 2] 和一个定值 S,求数组中是否存在几个元素值和为 S 采取从后向前看的思想。假设选了 2,那只需在前几项中查找是否存在和为 S-2。假设没选 2,那只需在前几项中查找是否存在和为 S。 定义函数 handle(arr, i, s),则有 handle(arr,i,s)={选:handle(arr,i−1,s−arr[i])不选:handle(arr,i−1,s)handle(arr, i, s)=\left\{ \begin{array}{c}原创 2021-09-15 12:03:45 · 320 阅读 · 0 评论 -
和最大的不相邻元素
和最大的不相邻元素 对于一个数组 [1, 2, 4, 1, 7, 8, 3] 选出 和 最大的不相邻元素(可以隔1,2…个元素),例如选择 1473 得到最大的和 15。 假设第 i 个元素的最优解为 opt[i],对于该元素,可以选它或者不选它,如果不选它那最优解变成了 opt[i-1]。如果选它,由于至少隔一个元素,那和相当于opt[i-1] + 该元素值,即 OPT(i)=max(OPT(i−1),OPT(i−2)+vali) OPT(i) = max(OPT(i-1), OPT(i-2) + val原创 2021-09-14 18:56:32 · 52 阅读 · 0 评论 -
赚钱最多的工作方案
赚钱最多的工作方案 黑块是八个工作,横轴是工作的时间段,红字是做这个工作赚的钱数。现在求赚最多钱的方案,而且工作时间不能重叠,例如选择 5 号后只能选 8 号了。 定义数组OPT[],其中OPT[i]前i+1个工作的最优解,这里指考虑排在前面的工作。 对于每个工作,有选或不选两种情况。例如求OPT[7],如果不选 8 号,那只能考虑前 7 个工作的最好结果。选的话,那就不能选 6 和 7 了,赚的钱相当于 8 的钱加上 5 号之前转的做多的钱。再取选或不选的最大值就行,即 OPT[7]=max(OPT[6原创 2021-09-13 19:55:50 · 56 阅读 · 0 评论