• toc {:toc}

문제 ν™•μΈν•˜κΈ°

풀이

μŠ€ν‹°μ»€ ν•˜λ‚˜λ₯Ό λ–Όμ–΄ λ‚΄λ©΄ μ™Όμͺ½, 였λ₯Έμͺ½, μœ„, μ•„λž˜λŠ” μ‚¬μš©ν•  수 μ—†λ‹€. 즉, λŒ€κ°μ„ μ— μžˆλŠ” μŠ€ν‹°μ»€λ₯Ό κ°€μ Έμ˜¬ 수 μžˆλ‹€. μ•„λž˜μ™€ κ°™λ‹€.

image

λ˜λŠ”, μ•„λž˜μ™€ 같이 선택할 수 μžˆλ‹€.

image

점프λ₯Ό μ΄ν•΄ν•˜κΈ° μœ„ν•΄ μ˜ˆμ‹œλ₯Ό λ“€λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.
맨 μ™Όμͺ½ μ•„λž˜ 30μ—μ„œ μ‹œμž‘ν•œλ‹€κ³  ν–ˆμ„ λ•Œ λŒ€κ° 두 번 10, 70을 μ–»λŠ” 것보닀 3μ—΄ λŒ€κ°μΈ 100을 μ–»λŠ” 것이 더 μ μˆ˜κ°€ 높을 수 있기 λ•Œλ¬Έμ— 두 μΉΈ 뒀도 μƒκ°ν•΄μ€˜μ•Ό ν•œλ‹€. μ„Έ μΉΈ 뒀인 4μ—΄μ˜ 경우둜 λ°”λ‘œ μ ν”„ν•˜λŠ” κ²½μš°λŠ” μ•žμ˜ 2μ—΄, 3μ—΄ 쀑 ν•˜λ‚˜λ₯Ό μ„ νƒν•˜λŠ” 것이 λ°˜λ“œμ‹œ 더 큰 값을 λ„μΆœν•˜κΈ° λ•Œλ¬Έμ— ν•΄λ‹Ήν•˜μ§€ μ•ŠλŠ”λ‹€.

λ§Œμ•½, 50μ—μ„œ μ‹œμž‘ν•œλ‹€κ³  ν–ˆμ„ λ•Œ μ ν”„ν•΄μ„œ 3μ—΄μ˜ 100을 λ°”λ‘œ λ”ν•˜λŠ” 것도 κ³ λ €ν•΄μ€˜μ•Ό ν• κΉŒ? 해쀄 ν•„μš” μ—†λ‹€. 3μ—΄μ˜ 100을 λ”ν•˜λŠ” κ²½μš°μ—λŠ” 2μ—΄μ˜ 50을 λ”ν•˜λŠ” 것이 더 높은 값을 λ„μΆœν•˜κΈ° λ•Œλ¬Έμ— λŒ€κ°μ˜ 경우만 κ³ λ €ν•΄μ£Όλ©΄ λœλ‹€.

#include <bits/stdc++.h>
using namespace std;
 
int n;
 
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
 
    int t;
 
    cin >> t;
 
    while(t--){
        int stickers[2][100005] = {0,};
        int dp[2][100005] = {0,};
 
        cin >> n;
 
        for(int i = 0; i < 2; i++){
            for(int j = 0; j < n; j++){
                cin >> stickers[i][j];
            }
        }
        dp[0][0] = stickers[0][0];
        dp[1][0] = stickers[1][0];
 
        dp[0][1] = stickers[0][1] + dp[1][0];
        dp[1][1] = stickers[1][1] + dp[0][0];
 
        for(int i = 2; i < n; i++){
            dp[0][i] = max(dp[1][i-2], dp[1][i-1]) + stickers[0][i];
            dp[1][i] = max(dp[0][i-2], dp[0][i-1]) + stickers[1][i];
        }
 
        cout << max(dp[0][n-1], dp[1][n-1]) << '\n';
 
    }
 
    return 0;
}