动态编程:带有记忆的递归是不是可以与任何递归解决方案或仅特定格式的解决方案一起使用?

Posted

技术标签:

【中文标题】动态编程:带有记忆的递归是不是可以与任何递归解决方案或仅特定格式的解决方案一起使用?【英文标题】:Dynamic Programming: Can recursion with memoization work with any recursive solution or only solutions in specific formats?动态编程:带有记忆的递归是否可以与任何递归解决方案或仅特定格式的解决方案一起使用? 【发布时间】:2021-06-04 09:58:34 【问题描述】:

我正在阅读有关动态规划的内容,并试图解决最长递增子序列问题。

我尝试提出一种蛮力递归方法,在该方法中我生成所有可能的递增子序列并检查哪个是最长的。

private int lis(int[] arr, int k, List<Integer> curr)
    int ans = 0;
    for(int i=k;i<arr.length;i++)
        if(!curr.isEmpty() && arr[i]<=curr.get(curr.size()-1))
            continue;
        
        curr.add(arr[i]);
        ans = Math.max(ans, curr.size());
        ans = Math.max(ans,lis(arr,i+1,curr));
        curr.remove(curr.size()-1);
    
    return ans;

这里arr 是输入数组,k 是 0,curr 是我存储当前递增子序列的列表,ans 是一个全局变量,用于记录最长递增子序列。我得到了这个解决方案的 TLE,这是预期的。

我知道这不是最有效的方法,因为我使用列表来跟踪元素,没有它也可以解决问题。但我仍在尝试将 memoization 应用于此代码作为练习。

我正在尝试了解记忆化是否可以应用于任何递归蛮力解决方案(或者它是否需要递归解决方案采用特定格式,因为有几种类型的递归,如尾递归等)?如果没有,它应该满足什么属性?

可以将memoization应用于上述算法以使其工作吗?

【问题讨论】:

【参考方案1】:

只要您能够创建一个能够识别参数是否相同的查找结构,就可以执行记忆化,以便您知道何时返回先前的结果。

在 Python 中,tuple 类似于 list,除了不可变和可散列,因此它可以在字典中使用。在其他语言中,您通常需要做更多的工作来创建基于元素的查找。那是什么工作取决于语言。最常见的后备方法是创建参数的字符串表示形式。

【讨论】:

以上是关于动态编程:带有记忆的递归是不是可以与任何递归解决方案或仅特定格式的解决方案一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

动态规划问题为什么要画表格?

我的背包递归解决方案可以改进吗?

动态规划与递归区别

动态规划的记忆法或制表法

递归详解

Koltin 递归尾递归和记忆化