字节跳动面试必备:背包问题与区间DP算法详解,虎哥带你轻松应对
日期: 2024-12-29 09:09:31 |浏览: 22|编号: 63461
友情提醒:信息内容由网友发布,本站并不对内容真实性负责,请自鉴内容真实性。
字节跳动面试必备:背包问题与区间DP算法详解,虎哥带你轻松应对
哎呀,最近好多朋友私信问我面试的事情。巧合的是,我前两天刚刚面试完一个应届毕业生。看到他紧张的样子,我想起了自己的时光……
来来来,今天胡哥给大家盘点一下Byte最喜欢的算法题。我们先来说说背包问题和区间DP这两个经典模型。别慌,跟着虎哥走,没有你解决不了的问题!
背包问题真的那么难吗?
记得那天面试的时候,我问朋友:“我给你一个背包,里面有容量V和n件物品,每件物品有一个重量w和一个价值v,你怎样才能装载价值最大的物品而不超过背包的容量是多少?”
小伙伴顿时愣住了,额头都冒汗了……
其实背包问题并没有那么可怕。我们看一下代码:
def knapsack(W, wt, val, n):
dp = [[0 for x in range(W + 1)] for x in range(n + 1)]
for i in range(n + 1):
for w in range(W + 1):
if i == 0 or w == 0:
dp[i][w] = 0
elif wt[i-1] <= w:
dp[i][w] = max(val[i-1] + dp[i-1][w-wt[i-1]], dp[i-1][w])
else:
dp[i][w] = dp[i-1][w]
return dp[n][W]
温馨提示:dp数组的初始化很关键。不要忘记处理 i=0 和 w=0 的边界情况。
间隔DP?有点意思...
说实话,区间DP经常出现在Byte采访中。记得有一次面试官问我:“给定一个字符串,每次操作都可以删除一个连续的子串,删除的成本就是子串的长度,求删除整个字符串的最小成本。”
这不是一个经典的区间DP题吗?看代码:
def min_cost(s):
n = len(s)
dp = [[float('inf')] * n for _ in range(n)]
for i in range(n):
dp[i][i] = 1
for length in range(2, n + 1):
for i in range(n - length + 1):
j = i + length - 1
if s[i] == s[j]:
dp[i][j] = min(dp[i+1][j], dp[i][j-1])
else:
for k in range(i, j):
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j])
return dp[0][n-1]
提示:对于区间DP,一定要注意遍历顺序。首先枚举区间长度,然后枚举左端点。
实际案例:我通过了这个测试!