[Codeforces] Round574(div2) : C - Basketball Exercise

Round574(div2) : C - Basketball Exercise

풀이

DP

백준DP문제중 포도주문제와 비슷했어서 아이디어가 바로 떠올랐다.

이 DP의 포인트는 중간에 한번 선택을 안해도 된다는것이다.

중간에 한번 선택을 안하는 대신, 그전의 두값중 큰값을 기록해두면 된다.

그리고는 다음과 같은 지그재그로 max를 구하거나 선택안하는 경우를 점화식을 세우면 된다.

dp2[i] = max(dp[i - 1],dp3[i-1]) + arr2[i];
dp[i] = max(dp2[i - 1],dp3[i-1]) + arr[i];
dp3[i] = max(dp[i - 1], dp2[i - 1]);

long long 타입으로 dp를 만들지 않아서 한번 틀리는 실수를 했다.

코드

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#include <cstring>
#include <string>
#include <queue>
#include <map>
using namespace std;
 
int arr[100000];
int arr2[100000];
long long dp[100000];
long long dp2[100000];
long long dp3[100000];
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }
    for (int i = 0; i < n; i++) {
        cin >> arr2[i];
    }
    dp[0] = arr[0], dp2[0] = arr2[0], dp3[0] = 0;
    for (int i = 1; i < n; i++) {
        dp2[i] = max(dp[i - 1],dp3[i-1]) + arr2[i];
        dp[i] = max(dp2[i - 1],dp3[i-1]) + arr[i];
        dp3[i] = max(dp[i - 1], dp2[i - 1]);
    }
    cout << max(dp[n - 1], dp2[n - 1]);
    return 0;
}
Written on July 19, 2019