思维题,就是记录一遍前面的记录一遍后面的,然后选取当前点时,不选当前的点,而选取他左右的最大值即可。
解题思路:
- 记录当前点前面的值,b[i],取a[i] 和mx + a [i] 的较大值即可,然后mx 改成他俩当中的较大值
- 后面往前遍历也是如此,最终遍历取最大值即可
学到知识:
- max({a,b,c}) 可以取最大值,库是algorithm (C++11 ) 新特性
代码:
#include <iostream>
using namespace std;
const int N = 100010;
int a[N], b[N], c[N];
int main(){
int n;
scanf("%d",&n);
for (int i = 1; i <= n; i++){
scanf("%d",&a[i]);
}
int mx = -1e9;
for (int i = 1; i <= n; i ++){
b[i] = max(a[i],a[i] + mx);
mx = max(a[i],a[i] + mx);
}
mx = -1e9;
for (int i = n; i >= 1; i--){
c[i] = max(a[i],a[i] + mx);
mx = max(a[i],a[i] + mx);
}
mx = -1e9;
for (int i = 2; i < n ; i++){
mx = max(mx,b[i - 1] + c[i + 1]);
mx = max(mx,b[i - 1]);
mx = max(mx,c[i + 1]);
}
printf("%d\n",mx);
return 0;
}