根据给定标准的最大金额
Posted
技术标签:
【中文标题】根据给定标准的最大金额【英文标题】:maximum sum according to given criteria 【发布时间】:2016-05-27 19:45:13 【问题描述】:我正在解决作为作业分配给我的一个问题。我很努力,但无法达到最佳解决方案。
有 N 个商店,所有商店都线性排列,索引为 1,2,3...N。购买任何 来自商店
S(i)
的正数商品提供等于H(i)
的幸福感。 不幸的是,由于一些不可避免的情况,每个店主都有 引入了一个值L(i)
。如果您在i
th 商店获得H(i)
幸福,则 并且仅当这是您购买东西的第一家商店或您购买时 这家商店至少有一件商品,您最后一次购物的商店是S(j)
这样L(j)≤L(i)
和j<i
。找到最大的幸福总和 按照上面给出的规则获得!
我想应用最大子数组总和并将L(i)
作为标准。这是代码->>
long long ans=INT_MIN, temp=0, prev=-1;
for(int i=0;i<n;i++)
l = L[i];
if(l>=prev)
temp+=H[i];
if(temp<0)
temp = 0;
prev = -1;
if(temp>ans)
ans = temp;
prev=L[i];
else
if(H[i]>ans)
ans = H[i];
prev = L[i];
temp = H[i];
else if(H[i] == ans && L[i]<prev)
prev = L[i];
这不适用于许多测试用例!有更好的解决方案吗?
【问题讨论】:
你用“纸笔”解决方案了吗? 你尝试了几个测试用例并编写了解决方案......但意识到这是错误的! 我猜有些东西不见了。没有任何条件可以阻止我们从 1 到 N 的所有商店购物。 你知道L
可能包含的内容吗?还是那不可用?
我问是因为如果L
只有不同的、有限的值(比如只有1, 2, 3, or 4
),那么您可以使用查找并将复杂性降低到O(N)
【参考方案1】:
令 F[i] 等于如果最后访问的商店是 i 可获得的最大幸福。
您可以通过计算所有有效前任(j
那么你能做的最好的就是F[i]中的最大值。
【讨论】:
这是一个 O(n^2) 算法...可以在线性时间内完成吗? 在这方面没有比 O(n^2) 做得更好的方法 但问题约束(N 应该可以在O(n log n)
中实现这个。我们需要在[0, L[i]]
中找到最大值,例如,我们可以用线段树在对数时间内完成。如果L
很小,这是可行的,如果不是,可能有办法将L
标准化为[0, n]
。
@IVlad 我同意,我们可以在 O(nlogn) 时间内对 L[i] 值进行排序以使其正常化,因此您的方法应该始终可以正常工作。【参考方案2】:
L[i] 将确定您可以采用的可能路径,因此我认为您应该能够构建具有不同起点的多棵树 L[i] 每个节点都包含 H[i] 作为值。 然后你遍历这棵树,每片叶子的总和给你可能的幸福。
【讨论】:
建造树木听起来很复杂,并且至少需要 O(n^2) 来确定可能的孩子 经过进一步求解,树的构造确实比我想象的要复杂。而且我在构造方面的改进似乎使其收敛到 Peter de Rivaz 的回答。以上是关于根据给定标准的最大金额的主要内容,如果未能解决你的问题,请参考以下文章