【发布时间】:2022-01-07 18:54:23
【问题描述】:
我为最长递增子序列编写了一个递归解决方案,它工作得非常好。但是当我在相同的代码上应用 dp 时,它给出了不同的答案。 问题链接:https://practice.geeksforgeeks.org/problems/longest-increasing-subsequence-1587115620/1 递归代码:
int LISrecursive(int arr[], int n, int currIndex, int maxVal) {
if (currIndex == n) {
return 0;
}
int included = 0, notIncluded = 0;
if (arr[currIndex] > maxVal) {
included = 1 + LISrecursive(arr, n, currIndex + 1, arr[currIndex]);
}
notIncluded = LISrecursive(arr, n, currIndex + 1, maxVal);
return max(notIncluded, included);
}
DP 代码:
int LISdp(int arr[], int n, int currIndex, int maxVal, vector<int> &dp) {
if (currIndex == n) {
return 0;
}
if (dp[currIndex] != -1) return dp[currIndex];
int included = 0, notIncluded = 0;
if (arr[currIndex] > maxVal) {
included = 1 + LISdp(arr, n, currIndex + 1, arr[currIndex], dp);
}
notIncluded = LISdp(arr, n, currIndex + 1, maxVal, dp);
return dp[currIndex] = max(notIncluded, included);
}
int32_t main() {
int n;
cin >> n;
int arr[n];
vector<int> dp(n, -1);
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
cout << LISrecursive(arr,n,0,-1);
cout << LISdp(arr, n, 0 , -1, dp);
return 0;
}
我不知道我做错了什么? 对于这个测试用例 6 (n) 6 3 7 4 6 9 (arr[]) 递归代码给出 4 个答案(正确) 但是 DP 代码给出了 3 个答案(不正确)
【问题讨论】:
-
您的代码中的
dp是什么? -
dp 是一个初始填充为 -1 的向量。
-
编译失败。没有在您的 LIS 中声明
dp并且您没有将dp传递给您的 LIS。 -
@UjjvalUjjval 我稍微编辑了您的代码以使其编译。确保您的代码是minimal reproducible example
-
考虑输入 arr=
5 1 2 3并使用调试器逐步完成该案例。您的dp条目正在记住第一个通过的maxVal的值,这不会给较低的数字提供机会。
标签: c++ recursion dynamic-programming