【问题标题】:maximum sum according to given criteria根据给定标准的最大金额
【发布时间】:2016-05-27 19:45:13
【问题描述】:

我正在解决作为作业分配给我的一个问题。我很努力,但无法达到最佳解决方案。

有 N 个商店,所有商店都线性排列,索引为 1,2,3...N。购买任何 来自商店S(i) 的正数商品提供等于H(i) 的幸福感。 不幸的是,由于一些不可避免的情况,每个店主都有 引入了一个值L(i)。如果您在ith 商店获得 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)

标签: c++ algorithm dynamic-programming


【解决方案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 的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多