根据给定标准的最大总和

时间:2016-05-27 19:45:14

标签: c++ algorithm dynamic-programming

我正在解决一个给我的问题。我努力但无法达到最佳解决方案。

  

有N个商店,所有商店都线性对齐,索引1,2,3 ... N.买任何    商店S(i)中的正数项目给出的幸福感等于H(i)。    不幸的是,由于一些不可避免的情况,每个店主都有    引入了值L(i)。如果您被H(i)商店认定为i幸福   并且只有这是您购买的第一家商店或者您购买的商品   此商店中至少有一件商品和您购买的最后一家商店是S(j)   这样L(j)≤L(i)j<i。找到可以达到的最大幸福总和   按照上面给出的规则获得!

我认为应用最大子阵列总和以及L(i)作为标准。这是代码 - &gt;&gt;

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];
    }

这不适用于许多测试用例!有更好的解决方案吗?

2 个答案:

答案 0 :(得分:2)

如果最后一家商店是i,那么F [i]等于可获得的最大幸福感。

您可以通过计算所有有效前驱(j

然后你能做的最好的就是F [i]中的最大值。

答案 1 :(得分:0)

L [i]将确定您可以采取的可能路径,因此我认为您应该能够构建具有L [i]的不同起点的多个树,其中每个节点包含H [i]作为值。 然后你对这棵树进行遍历,每次休假的总和可以给你带来快乐。