【发布时间】:2017-07-10 02:08:49
【问题描述】:
在数组中计算 LIS(最长递增子序列)是一个非常著名的动态规划问题。然而在每个教程中,他们首先展示了不使用 DP 概念的递归解决方案,然后通过应用 Bottom-Up DP(迭代解决方案)来解决它。
我的问题是:
我们将如何在 Recursive Solution 中使用 Memoization。 不仅仅是记忆,而是使用一维数组的记忆。
我做了一些研究,但找不到任何相关的东西。虽然有 2 个地方要求递归记忆化 1 和 2 但那里的解决方案是使用 2D Map / Array 进行记忆化。
无论如何用一维数组记忆解决方案,会给出错误输出。 这是我所做的:
int lis(int idx, int prev)
{
if(idx >= N)
return 0;
if(dp[idx])
return dp[idx];
int best_ans = lis(idx+1, prev);
int cur_ans = 0;
if(arr[idx] > prev)
{
cur_ans = 1 + lis(idx+1, arr[idx]);
}
int ans = max(best_ans, cur_ans);
dp[idx] = ans;
return ans;
}
int main()
{
// Scan N
// Scan arr
ans = lis(0, -1));
print ans;
}
虽然我知道这个解决方案给出错误输出的原因:
基于前一个值的给定索引可以有多个解决方案。
但我仍然想知道如何使用一维数组来完成。
我很想知道解决方案,因为我读过每个 DP Top-Down 解决方案都可以重新构建为 Bottom-Up,反之亦然。
如果有人能提供一些见解,那将非常有帮助。
提前致谢。
【问题讨论】:
-
有人能解释一下我对同样问题感到困惑的这个问题吗?
标签: algorithm recursion dynamic-programming memoization lis