思路:对于一个景点A为终点时,其所有可能情况为前方个每个节点到A的进行观光。
采用暴力算法:对于每个节点为终点的情况,遍历其可能的出发节点,计算出每个节点为终点时观光值最大的情况,最大情况下观光值最高的节点的观光值。
优化:注意到观光值公式中以上述情况操作时,在确定终点节点后values[终点]-index[终点]是固定不变的,变化的是values[起点]+index[起点],也就是需要找到起点景点中最大的values[起点]+index[起点],这个最大值我们可以边遍历边更新,这样就避免了大量的重复计算。
代码:
int maxScoreSightseeingPair(vector<int>& values) {
int size = values.size(), ret = 0, mx = 0;
for (int i = 0; i < size; i++) {
ret = max(ret, mx + values[i] - i);
mx = max(mx, values[i] + i);
}
return ret;
}