#include <bits/stdc++.h>
using namespace std;
/*
Question:
You are given an integer array nums of length n, where nums[i] represents
the detection value of station i.
You may choose any subset of indices to activate. If you activate no stations,
the total value is 0.
If the chosen indices are:
i1 < i2 < ... < ik
then the net monitoring value is:
nums[i1] + nums[i2] + ... + nums[ik]
- ((i2 - i1 - 1) + (i3 - i2 - 1) + ... + (ik - i(k-1) - 1))
In other words:
- each chosen station adds its value
- for every pair of consecutive chosen stations, subtract the number of
unchosen indices between them
Return the maximum possible net monitoring value.
Example 1:
Input: nums = [5, -2, 4]
Output: 8
Explanation:
Choose indices [0, 2]
Gain = 5 + 4 = 9
Gap penalty = 2 - 0 - 1 = 1
Total = 8
Example 2:
Input: nums = [-3, -1, -7]
Output: 0
Explanation:
It is better to choose no station, so the answer is 0.
Example 3:
Input: nums = [3, 1, 2, 5]
Output: 11
Explanation:
Choose all indices [0, 1, 2, 3]
There are no gaps, so no penalty is paid.
Total = 11
Constraints:
1 <= n <= 2 * 10^5
-10^9 <= nums[i] <= 10^9
*/
class Solution {
public :
long long maxMonitoringValue( vector< int > & nums) {
// ans = best overall answer
// Start with 0 because choosing no station is allowed
long long ans = 0 ;
// best stores max(dp[j] + j) over all previous j
// where dp[j] = best value of a non-empty chosen set
// ending exactly at index j
long long best = LLONG_MIN;
for ( int i = 0 ; i < ( int ) nums.size ( ) ; i++ ) {
// Case 1:
// Start a new chosen set using only index i
long long cur = nums[ i] ;
// Case 2:
// Extend a previous set ending at j, then choose i
//
// Transition:
// dp[i] = dp[j] + nums[i] - (i - j - 1)
// = dp[j] + nums[i] - i + j + 1
// = (dp[j] + j) + (nums[i] - i + 1)
//
// So if we maintain max(dp[j] + j), transition becomes O(1)
if ( best ! = LLONG_MIN) {
cur = max( cur, best + 1LL * nums[ i] - i + 1 ) ;
}
// Update final answer
ans = max( ans, cur) ;
// This index i can be the previous endpoint for future positions
best = max( best, cur + i) ;
}
return ans;
}
} ;
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovKgpRdWVzdGlvbjoKWW91IGFyZSBnaXZlbiBhbiBpbnRlZ2VyIGFycmF5IG51bXMgb2YgbGVuZ3RoIG4sIHdoZXJlIG51bXNbaV0gcmVwcmVzZW50cwp0aGUgZGV0ZWN0aW9uIHZhbHVlIG9mIHN0YXRpb24gaS4KCllvdSBtYXkgY2hvb3NlIGFueSBzdWJzZXQgb2YgaW5kaWNlcyB0byBhY3RpdmF0ZS4gSWYgeW91IGFjdGl2YXRlIG5vIHN0YXRpb25zLAp0aGUgdG90YWwgdmFsdWUgaXMgMC4KCklmIHRoZSBjaG9zZW4gaW5kaWNlcyBhcmU6CmkxIDwgaTIgPCAuLi4gPCBpawoKdGhlbiB0aGUgbmV0IG1vbml0b3JpbmcgdmFsdWUgaXM6CgpudW1zW2kxXSArIG51bXNbaTJdICsgLi4uICsgbnVtc1tpa10KLSAoKGkyIC0gaTEgLSAxKSArIChpMyAtIGkyIC0gMSkgKyAuLi4gKyAoaWsgLSBpKGstMSkgLSAxKSkKCkluIG90aGVyIHdvcmRzOgotIGVhY2ggY2hvc2VuIHN0YXRpb24gYWRkcyBpdHMgdmFsdWUKLSBmb3IgZXZlcnkgcGFpciBvZiBjb25zZWN1dGl2ZSBjaG9zZW4gc3RhdGlvbnMsIHN1YnRyYWN0IHRoZSBudW1iZXIgb2YKICB1bmNob3NlbiBpbmRpY2VzIGJldHdlZW4gdGhlbQoKUmV0dXJuIHRoZSBtYXhpbXVtIHBvc3NpYmxlIG5ldCBtb25pdG9yaW5nIHZhbHVlLgoKRXhhbXBsZSAxOgpJbnB1dDogbnVtcyA9IFs1LCAtMiwgNF0KT3V0cHV0OiA4CkV4cGxhbmF0aW9uOgpDaG9vc2UgaW5kaWNlcyBbMCwgMl0KR2FpbiA9IDUgKyA0ID0gOQpHYXAgcGVuYWx0eSA9IDIgLSAwIC0gMSA9IDEKVG90YWwgPSA4CgpFeGFtcGxlIDI6CklucHV0OiBudW1zID0gWy0zLCAtMSwgLTddCk91dHB1dDogMApFeHBsYW5hdGlvbjoKSXQgaXMgYmV0dGVyIHRvIGNob29zZSBubyBzdGF0aW9uLCBzbyB0aGUgYW5zd2VyIGlzIDAuCgpFeGFtcGxlIDM6CklucHV0OiBudW1zID0gWzMsIDEsIDIsIDVdCk91dHB1dDogMTEKRXhwbGFuYXRpb246CkNob29zZSBhbGwgaW5kaWNlcyBbMCwgMSwgMiwgM10KVGhlcmUgYXJlIG5vIGdhcHMsIHNvIG5vIHBlbmFsdHkgaXMgcGFpZC4KVG90YWwgPSAxMQoKQ29uc3RyYWludHM6CjEgPD0gbiA8PSAyICogMTBeNQotMTBeOSA8PSBudW1zW2ldIDw9IDEwXjkKKi8KCmNsYXNzIFNvbHV0aW9uIHsKcHVibGljOgogICAgbG9uZyBsb25nIG1heE1vbml0b3JpbmdWYWx1ZSh2ZWN0b3I8aW50PiYgbnVtcykgewogICAgICAgIC8vIGFucyA9IGJlc3Qgb3ZlcmFsbCBhbnN3ZXIKICAgICAgICAvLyBTdGFydCB3aXRoIDAgYmVjYXVzZSBjaG9vc2luZyBubyBzdGF0aW9uIGlzIGFsbG93ZWQKICAgICAgICBsb25nIGxvbmcgYW5zID0gMDsKCiAgICAgICAgLy8gYmVzdCBzdG9yZXMgbWF4KGRwW2pdICsgaikgb3ZlciBhbGwgcHJldmlvdXMgagogICAgICAgIC8vIHdoZXJlIGRwW2pdID0gYmVzdCB2YWx1ZSBvZiBhIG5vbi1lbXB0eSBjaG9zZW4gc2V0CiAgICAgICAgLy8gZW5kaW5nIGV4YWN0bHkgYXQgaW5kZXggagogICAgICAgIGxvbmcgbG9uZyBiZXN0ID0gTExPTkdfTUlOOwoKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpbnVtcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAvLyBDYXNlIDE6CiAgICAgICAgICAgIC8vIFN0YXJ0IGEgbmV3IGNob3NlbiBzZXQgdXNpbmcgb25seSBpbmRleCBpCiAgICAgICAgICAgIGxvbmcgbG9uZyBjdXIgPSBudW1zW2ldOwoKICAgICAgICAgICAgLy8gQ2FzZSAyOgogICAgICAgICAgICAvLyBFeHRlbmQgYSBwcmV2aW91cyBzZXQgZW5kaW5nIGF0IGosIHRoZW4gY2hvb3NlIGkKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gVHJhbnNpdGlvbjoKICAgICAgICAgICAgLy8gZHBbaV0gPSBkcFtqXSArIG51bXNbaV0gLSAoaSAtIGogLSAxKQogICAgICAgICAgICAvLyAgICAgICA9IGRwW2pdICsgbnVtc1tpXSAtIGkgKyBqICsgMQogICAgICAgICAgICAvLyAgICAgICA9IChkcFtqXSArIGopICsgKG51bXNbaV0gLSBpICsgMSkKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gU28gaWYgd2UgbWFpbnRhaW4gbWF4KGRwW2pdICsgaiksIHRyYW5zaXRpb24gYmVjb21lcyBPKDEpCiAgICAgICAgICAgIGlmIChiZXN0ICE9IExMT05HX01JTikgewogICAgICAgICAgICAgICAgY3VyID0gbWF4KGN1ciwgYmVzdCArIDFMTCAqIG51bXNbaV0gLSBpICsgMSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFVwZGF0ZSBmaW5hbCBhbnN3ZXIKICAgICAgICAgICAgYW5zID0gbWF4KGFucywgY3VyKTsKCiAgICAgICAgICAgIC8vIFRoaXMgaW5kZXggaSBjYW4gYmUgdGhlIHByZXZpb3VzIGVuZHBvaW50IGZvciBmdXR1cmUgcG9zaXRpb25zCiAgICAgICAgICAgIGJlc3QgPSBtYXgoYmVzdCwgY3VyICsgaSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYW5zOwogICAgfQp9Ow==