Removal of billboards from given ones

前端 未结 7 1910
Happy的楠姐
Happy的楠姐 2020-12-14 11:46

I came across this question

ADZEN is a very popular advertising firm in your city. In every road you can see their advertising billboards. Recentl

相关标签:
7条回答
  • 2020-12-14 12:33

    I coded it in c++ using DP in O(nlogk). Idea is to maintain a multiset with next k values for a given position. This multiset will typically have k values in mid processing. Each time you move an element and push new one. Art is how to maintain this list to have the profit[i] + answer[i+2]. More details on set:

    
    
    /*
     * Observation 1: ith state depends on next k states i+2....i+2+k
     * We maximize across this states added on them "accumulative" sum
     *
     * Let Say we have list of numbers of state i+1, that is list of {profit + state solution}, How to get states if ith solution
     *
     * Say we have following data k = 3
     *
     * Indices:     0   1   2   3   4
     * Profits:     1   3   2   4   2
     * Solution:    ?   ?   5   3   1
     *
     * Answer for [1] = max(3+3, 5+1, 9+0) = 9
     *
     * Indices:     0   1   2   3   4
     * Profits:     1   3   2   4   2
     * Solution:    ?   9   5   3   1
     *
     * Let's find answer for [0], using set of [1].
     *
     * First, last entry should be removed. then we have (3+3, 5+1)
     *
     * Now we should add 1+5, but entries should be incremented with 1
     *      (1+5, 4+3, 6+1) -> then find max.
     *
     *  Could we do it in other way but instead of processing list. Yes, we simply add 1 to all elements
     *
     *  answer is same as: 1 + max(1-1+5, 3+3, 5+1)
     *
     */
    

    ll dp()
    {
    multiset<ll, greater<ll> > set;
    
    mem[n-1] = profit[n-1];
    
    ll sumSoFar = 0;
    
    lpd(i, n-2, 0)
    {
        if(sz(set) == k)
            set.erase(set.find(added[i+k]));
    
        if(i+2 < n)
        {
            added[i] = mem[i+2] - sumSoFar;
            set.insert(added[i]);
            sumSoFar += profit[i];
        }
    
        if(n-i <= k)
            mem[i] = profit[i] + mem[i+1];
        else 
            mem[i] = max(mem[i+1], *set.begin()+sumSoFar);
    }
    
    return mem[0];
     }
    
    0 讨论(0)
提交回复
热议问题