안녕하세요. 오늘은 스위치를 누를 거예요.

문제

https://www.acmicpc.net/problem/30460

아이디어

mx[i]를 i번째까지 고려했을 때의 최댓값으로 정의합시다.
그러면 mx[i]는 mx[i-1]에 자기자신을 더하거나 mx[i-3]에 (arr[i-2]+arr[i-1]+arr[i])*2를 더한값중 최댓값이 됩니다.

소스코드

#include <iostream>
#include <algorithm>
using namespace std;

int mx[202020] = { 0 }, arr[202020] = { 0 };
int main(void)
{
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    int N, i, first = 0, second = 0, now;

    cin >> N;
    for (i = 1; i <= N + 2; i++) //맨 마지막 스위치까지 고려해주기
    {
        mx[i] = -2e9;
        if (i <= N) cin >> arr[i];
        else arr[i] = 0;
        if (i >= 3) mx[i] = max(mx[i], mx[i - 3] + (arr[i - 2] + arr[i - 1] + arr[i]) * 2); //두배
        mx[i] = max(mx[i], mx[i - 1] + arr[i]);
    }

    cout << mx[N + 2];
}


감사합니다.

0개의 댓글