直觉地将最长的递增子序列问题自上而下转为2 dp

问题描述

我一直在遵循一种方法来帮助我解决动态编程问题的解决方案,在其中进行研究并找到一个递归解决方案,然后根据内部的参数和递归调用进行制表,以便更好地理解该过程。然后我优化是否可以看到一维版本。

我已经尝试着解决最长的子字符串问题,但是我完全困惑为什么将代码转换为列表2D格式时它不能正常工作(对于数组[4,2,3,6,10,1,12]它返回4而不是5)。我将其包含在下面,任何帮助都将是惊人的!

具有备忘录的递归

def longest_increasing_subseq(arr):

    @lru_cache(None)
    def lis(idx,prevIdx):

        if idx >= len(arr):
            return 0

        res = 0

        if prevIdx == -1 or arr[prevIdx] < arr[idx]:
            res = 1 + lis(idx + 1,idx)

        return max(res,lis(idx + 1,prevIdx))

    return lis(0,-1)

二维列表

def longest_increasing_subseq_dp(arr):

    n = len(arr)

    dp = [[0] * n for _ in range(n)]

    for i in range(n):
        dp[i][i] = 1

    res = 0

    for idx in range(n-2,-1,-1):
        for prevIdx in range(n):
            if arr[prevIdx] < arr[idx]:
                dp[idx][prevIdx] = max(1 + dp[idx+1][idx],dp[idx+1][prevIdx])
            else:
                dp[idx][prevIdx] = dp[idx+1][prevIdx]
            
            res = max(res,dp[idx][prevIdx])

    return dp

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)