配列が1 2 3 4 5
Here で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アルゴリズムが存在する場合、またはより高速なアルゴリズムを提案できますか。
さまざまなテストケースを試しましたが、正しい答えが得られました。誤った応答を返すテスト ケースを見つけた場合は、それも指摘してください。