您好我正在尝试为以下问题构建动态编程解决方案:
鉴于一个家庭每天消耗2公斤苹果,苹果持续10天,而第i天每天苹果公斤的价格是p [i],我必须找到最低成本,所以家庭不会用完了苹果。
如果没有10天的限制我已经提出了解决方案,那我就制作了一个新阵列:
locmin=p[1]
for i=2 to n
if locmin>=p[i] then c[i]=p[i]
else locmin=p[i] c[i]=p[i]
and then
OPT[1]=c[i]
OPT(i)=OPT[i-1]+2*c[i] (well not so much of dynamic programming but it is O(n)) .
当考虑10天限制时,我想出了ac [i,10]矩阵,其中我以与之前相同的方式存储前10天窗口的最低值,每个i-10,我想出了解决方案
OPT(i)=OPT[i-1]+2*min(p[i,j]) 0<j<=10
。 O(n ^ 2)解 有什么想法吗?
答案 0 :(得分:0)
我们不仅可以在10天内O(n)
进行kg
,而且可以使用任意大小的窗口。我们一次要花一天时间。家里每天都吃2公斤苹果。 仅这两个2 * best_price
的价格是多少?显然,它是best_price = min(p[i-9...i])
,其中class A
{
int a = 0;
int b;
int c;
public:
A(int x) : b{ x }, c{ x } { }
A() : b{ 1 }, c{ 0 } { }
};
。
让我们保持堆叠。如果价格较高,我们会添加到堆栈中,如果价格较低,我们会弹出堆栈直到较低的早期价格或堆栈为空,然后添加新价格。堆栈中的第一个元素将是最佳选择,它将在到期时被堆栈中的下一个元素替换。