【发布时间】:2013-09-17 11:44:40
【问题描述】:
假设数组是1 2 3 4 5
这里N = 5,我们必须选择3个元素,我们不能选择超过2个连续的元素,所以P = 3和k = 2。所以这里的输出将是1 + 2 + 4 = 7。
我想出了一个递归解决方案,但它的时间复杂度是指数级的。这是代码。
#include<iostream>
using namespace std;
void mincost_hoarding (int *arr, int max_size, int P, int k, int iter, int& min_val, int sum_sofar, int orig_k)
{
if (P == 0)
{
if (sum_sofar < min_val)
min_val = sum_sofar;
return;
}
if (iter == max_size)
return;
if (k!=0)
{
mincost_hoarding (arr, max_size, P - 1, k - 1, iter + 1, min_val, sum_sofar + arr[iter], orig_k);
mincost_hoarding (arr, max_size, P, orig_k, iter + 1, min_val, sum_sofar, orig_k);
}
else
{
mincost_hoarding (arr, max_size, P, orig_k, iter + 1, min_val, sum_sofar, orig_k);
}
}
int main()
{
int a[] = {10, 5, 13, 8, 2, 11, 6, 4};
int N = sizeof(a)/sizeof(a[0]);
int P = 2;
int k = 1;
int min_val = INT_MAX;
mincost_hoarding (a, N, P, k, 0, min_val, 0, k);
cout<<min_val;
}
另外,如果假设 P 元素不能在约束之后被选择,那么我们返回 INT_MAX。
我在一次采访中被问到这个问题。在提出这个解决方案后,面试官期待更快的结果。也许,一个DP方法来解决这个问题。如果存在,有人可以提出一种 DP 算法,或者更快的算法。
我尝试了各种测试用例并得到了正确的答案。如果您发现某些测试用例给出了错误的响应,也请指出。
【问题讨论】:
-
如果数组是{1,2,3,4,5,6}且P=4,k=3,那么可以选择1,2,4,5吗?
-
否,则应选择 1、2、3、5。当 k = 3 时,您最多可以同时选择 3 个连续元素。
-
建议:避免在您的示例中使用排序数组,这是“误导”(如果是排序数组,解决方案很简单)。
-
原始数组排序中的连续元素?还是数轴中的连续元素?对于 {1,5,2},P=2,k=1,答案是 {1,5} 还是 {1,2}?
-
答案是 1, 2。数组排序中的连续元素。还有@Jarod42,下次我会记住这一点。选择排序数组可能不是解释问题的最佳方式。
标签: c++ algorithm dynamic-programming