https://leetcode.com/problems/best-sightseeing-pair/
//题目要求求出A[i] + A[j] + i - j最大值,这个表达式可以等价变为 (A[i] + i ) + (A[j] - j),
//对于A中每一个元素来说,都对应着两个值,分别是A[i]+i和A[i]-i。本题的解法可以抽象成把A分成两部分,
//第一部分找出使得A[i]+i能得到最大值的i,第二部分找出A[j]-j能得到最大值的j,两者之和就是最终的结果。
class Solution {
public:
int maxScoreSightseeingPair(vector<int>& A) {
int n = A.size();
vector<int> maxA(n);
maxA[0] = A[0] + 0;
for(int i=1; i<n;i++){
maxA[i] = max(maxA[i-1], A[i]+i);//maxA[i]为i之前最大的情况值了
}
int maxB = A[n-1]-(n-1);
int ans = maxA[n-2]+maxB;
for(int i=n-2;i>=1;i--){
maxB = max(maxB, A[i]-i); //后缀最大值
ans = max(ans, maxA[i-1]+maxB);//i-1前和i后的最大值 两最大值相加
}
return ans;
}
};