每日一题 — 2020 - 04 - 13

题目链接

思维题,就是记录一遍前面的记录一遍后面的,然后选取当前点时,不选当前的点,而选取他左右的最大值即可。


解题思路:

  • 记录当前点前面的值,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;
}
发布了121 篇原创文章 · 获赞 7 · 访问量 4330

猜你喜欢

转载自blog.csdn.net/LiangNiuMu/article/details/105494454