最优解法
注意到,观光值为A[i]+i+A[j]-j.
对每一个固定的j,最大的观光值为A[j]-j+max(A[i]-i),i<j。
我们选择从头开始遍历j
显然这个max(A[i]-i)是可以在遍历过程中维护的。
同时遍历时也可计算观光值的最大值。所以时间复杂度为o(n),空间复杂度为o(1)。
代码:
class Solution {
public int maxScoreSightseeingPair(int[] A) {
int maxi = A[0];
int max = A[1]+maxi-1;
for(int j=2;j<A.length;j++){
//更新maxi;
maxi = maxi>A[j-1]+j-1?maxi:A[j-1]+j-1;
max = max>A[j]-j+maxi?max:A[j]-j+maxi;
}
return max;
}
}
历史版本
这是我最开始的做法,虽然考虑到了max的存在,但是,我没有注意到这种dp是可以省略的,由于每次dp数组的更新都只涉及到上一个状态,所以数组可由一个变量来取代。以下是我第一次做的解法,时间复杂度为o(n),空间复杂度为o(n);
class Solution {
public int maxScoreSightseeingPair(int[] A) {
int n=A.length;
int[] dp=new int[A.length];
dp[n-2]=A[n-1]-n+1;
for(int i=n-2;i>0;i--){
dp[i-1]=dp[i]>A[i]-i?dp[i]:A[i]-i;
}
int max=A[0]+dp[0];
for(int i=1;i<=n-2;i++){
int temp=A[i]+i+dp[i];
max=max>temp?max:temp;
}
return max;
}
}