字节跳动面试必备:背包问题与区间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,一定要注意遍历顺序。首先枚举区间长度,然后枚举左端点。

实际案例:我通过了这个测试!

提醒:请联系我时一定说明是从铂牛网上看到的!