λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ”₯ PS(Problem Solving) πŸ”₯/BOJ

[BOJ] #2240 μžλ‘λ‚˜λ¬΄

by dar0m! 2019. 10. 2.
μ‹œκ°„ μ œν•œ λ©”λͺ¨λ¦¬ μ œν•œ μ •λ‹΅ λΉ„μœ¨
2 초 128 MB 35.371%

 

 

2240번: μžλ‘λ‚˜λ¬΄

μžλ‘λŠ” μžλ‘λ₯Ό μ’‹μ•„ν•œλ‹€. κ·Έλž˜μ„œ 집에 μžλ‘λ‚˜λ¬΄λ₯Ό 심어두고, μ—¬κΈ°μ„œ μ—΄λ¦¬λŠ” μžλ‘λ₯Ό λ¨Ήκ³ λŠ” ν•œλ‹€. ν•˜μ§€λ§Œ μžλ‘λŠ” ν‚€κ°€ μž‘μ•„μ„œ μžλ‘λ₯Ό λ”°λ¨Ήμ§€λŠ” λͺ»ν•˜κ³ , μžλ‘κ°€ λ–¨μ–΄μ§ˆ λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦° λ‹€μŒμ— λ–¨μ–΄μ§€λŠ” μžλ‘λ₯Ό λ°›μ•„μ„œ λ¨Ήκ³ λŠ” ν•œλ‹€. μžλ‘λ₯Ό μž‘μ„ λ•Œμ—λŠ” μžλ‘κ°€ ν—ˆκ³΅μ— μžˆμ„ λ•Œ μž‘μ•„μ•Ό ν•˜λŠ”λ°, μ΄λŠ” μžλ‘κ°€ λ§λž‘λ§λž‘ν•˜μ—¬ λ°”λ‹₯에 떨어지면 λͺ» 먹을 μ •λ„λ‘œ λ­‰κ°œμ§€κΈ° λ•Œλ¬Έμ΄λ‹€. 맀 μ΄ˆλ§ˆλ‹€, 두 개의 λ‚˜λ¬΄ 쀑 ν•˜λ‚˜μ˜ λ‚˜λ¬΄μ—μ„œ 열맀가 λ–¨μ–΄μ§€κ²Œ λœλ‹€. λ§Œμ•½ 열맀가 λ–¨μ–΄μ§€λŠ” μˆœκ°„, μžλ‘

www.acmicpc.net

 

문제

μžλ‘λŠ” μžλ‘λ₯Ό μ’‹μ•„ν•œλ‹€. μžλ‘κ°€ λ–¨μ–΄μ§ˆ λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦° λ‹€μŒμ— λ–¨μ–΄μ§€λŠ” μžλ‘λ₯Ό λ°›μ•„μ„œ λ¨Ήκ³ λŠ” ν•œλ‹€. μžλ‘κ°€ ν—ˆκ³΅μ— μžˆμ„ λ•Œ μž‘μ•„μ•Ό ν•˜λŠ”λ°

맀 μ΄ˆλ§ˆλ‹€, **두 개의 λ‚˜λ¬΄ 쀑 ν•˜λ‚˜**의 λ‚˜λ¬΄μ—μ„œ 열맀가 λ–¨μ–΄μ§€κ²Œ λœλ‹€. λ§Œμ•½ 열맀가 λ–¨μ–΄μ§€λŠ” μˆœκ°„, μžλ‘κ°€ κ·Έ λ‚˜λ¬΄μ˜ μ•„λž˜μ— μ„œ 있으면 μžλ‘λŠ” κ·Έ 열맀λ₯Ό 받아먹을 수 μžˆλ‹€.

 

μžλ‘λŠ” T(1≤T≤1,000)초 λ™μ•ˆ λ–¨μ–΄μ§€κ²Œ λœλ‹€. μžλ‘λŠ” μ΅œλŒ€ W(1≤W≤30)번만 움직이고 μ‹Άμ–΄ ν•œλ‹€. 맀 μ΄ˆλ§ˆλ‹€ μ–΄λŠ λ‚˜λ¬΄μ—μ„œ μžλ‘κ°€ λ–¨μ–΄μ§ˆμ§€μ— λŒ€ν•œ 정보가 μ£Όμ–΄μ‘Œμ„ λ•Œ, μžλ‘κ°€ 받을 수 μžˆλŠ” μžλ‘μ˜ 개수λ₯Ό κ΅¬ν•΄λ‚΄λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. μžλ‘λŠ” 1번 μžλ‘λ‚˜λ¬΄ μ•„λž˜μ— μœ„μΉ˜ν•΄ μžˆλ‹€κ³  ν•œλ‹€.

testcase 1

5 4
2
1
2
1
2

μ •λ‹΅ 4

 

 

 

 

λ©”λͺ¨λ¦¬ μ‹œκ°„
1532 KB 0 ms
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
int dp[3][1005][35], jado[1005];
int t, w, Max;
int main(){    
    scanf("%d%d"&t, &w);
    for (int i = 1; i <= t; i++) {
        scanf("%d"&jado[i]);
    }
    for (int i = 1; i <= t; i++) { // μ‹œκ°„
        for (int j = 0; j <= w; j++) { // μ›€μ§μΈ νšŸμˆ˜
            if (jado[i] == 1) {
                dp[1][i][j] = max(dp[1][i - 1][j] + 1, dp[2][i - 1][j - 1+ 1);
                dp[2][i][j] = max(dp[2][i - 1][j], dp[1][i - 1][j - 1]);
            }
            else {
                if (i == 1 && j == 0continue// 1초 λ•Œ 2번 μžλ‘λ‚˜λ¬΄μ—μ„œ μžλ‘κ°€ λ–¨μ–΄μ§€κ³  μ›€μ§μΈ νšŸμˆ˜κ°€ μ—†μœΌλ©΄ λͺ» λ¨ΉλŠ”λ‹€.
                dp[1][i][j] = max(dp[1][i - 1][j], dp[2][i - 1][j - 1]);
                dp[2][i][j] = max(dp[2][i - 1][j] + 1, dp[1][i - 1][j - 1+ 1);
            }
        }
    }
    for (int j = 0; j <= w; j++) {
        Max = max(Max, max(dp[1][t][j], dp[2][t][j]));
    }
    printf("%d", Max);
    return 0;
}
cs

 

  • j - 1을 μ ‘κ·Όν•˜λŠ”λ°λ„ j = 0 λΆ€ν„° μ‹œμž‘ν•΄λ„ λ˜λŠ” 이유. (질문 검색 - 질문 λ‹΅λ³€)

    j = 0 일 λ•Œ j-1μ΄λΌλŠ” μΈλ±μŠ€μ— μ ‘κ·Όν•˜κ²Œ λ©λ‹ˆλ‹€. λ°°μ—΄μ—μ„œ -1 μΈλ±μŠ€λŠ” 더 μƒμœ„ μ°¨μ›μ—μ„œ 1을 λΊ€ μ΅œλŒ€ μΈλ±μŠ€μ™€ κ°™μœΌλ―€λ‘œ 여기에 0값이 λ“€μ–΄μžˆλ‹€λ©΄ μ •μƒμž‘λ™ν•  것이고, λ‹€λ₯Έ 값이 λ“€μ–΄μžˆλ‹€λ©΄ μ˜€λ‹΅μ΄ λ‚˜μ˜€κ² μ£ .

 

λŒ“κΈ€