用一纬数组记录,如果不行就用二维,大部分是二维。
1、背包问题
01背包:有n件物体,容量为v的背包,使物品价值最大。假设第i件物品价值为c[i],重量为w[i]。dp[i][v]表示前i件物品放入v中的最大价值
dp[i][v] = Math.max(dp[i-1][v], dp[i-1][v-w[i]]+c[i])
完全背包:每件物品可以选无限次
dp[i][v] = Math.max(dp[i-1][v-kw[i]]+kc[i]) 0<k*w[i]<v
2、路径,类似这种矩形
image.png
就是比右一步和下一步
3、斐波那契,一纬数组
一次只能走1步或者2步楼梯,楼梯有n步,问有多少种走法
青蛙跳台阶
dp[n] = dp[n-1] + dp[n-2]
4、最大升序子序列问题
最大子序和
dp数组是以当前arr[i]结尾的最大升序子序列
5、最长公共子序列
编辑距离,以i结尾的字符串a和以j结尾的字符串b
当a[i]===b[j],dp[i][j] = dp[i][j]+1
不等,dp[i][j] =max( dp[i-1][j], dp[i][j-1] )
kmp算法基于这个
网友评论