我正在阅读有关动态规划的内容,并试图解决最长增加子序列问题。
我试图提出一种蛮力递归方法,在该方法中我生成所有可能的递增子序列并检查哪个是最长的。
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,这是预期的。
我知道这不是最有效的方法,因为我使用列表来跟踪元素,没有它可以解决问题。但我仍在尝试将此代码应用到记忆中作为练习。
我试图了解记忆化是否可以应用于任何递归蛮力解决方案(或者它是否需要递归解决方案采用特定格式,因为有几种类型的递归,如尾递归等)?如果没有,它应该满足什么属性?
可以将记忆化应用于上述算法以使其工作吗?