𝘚𝘭𝘰𝘸 𝘣𝘢𝘡 𝘴𝘡𝘦𝘒π˜₯𝘺

[λ°±μ€€] 2240번: μžλ‘λ‚˜λ¬΄ - C++ λ³Έλ¬Έ

μ½”λ”©ν…ŒμŠ€νŠΈ μ€€λΉ„/λ°±μ€€

[λ°±μ€€] 2240번: μžλ‘λ‚˜λ¬΄ - C++

.23 2022. 7. 14. 18:14
문제

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

맀 μ΄ˆλ§ˆλ‹€, 두 개의 λ‚˜λ¬΄ 쀑 ν•˜λ‚˜μ˜ λ‚˜λ¬΄μ—μ„œ 열맀가 λ–¨μ–΄μ§€κ²Œ λœλ‹€. λ§Œμ•½ 열맀가 λ–¨μ–΄μ§€λŠ” μˆœκ°„, μžλ‘κ°€ κ·Έ λ‚˜λ¬΄μ˜ μ•„λž˜μ— μ„œ 있으면 μžλ‘λŠ” κ·Έ 열맀λ₯Ό 받아먹을 수 μžˆλ‹€. 두 개의 λ‚˜λ¬΄λŠ” 그닀지 멀리 λ–¨μ–΄μ Έ μžˆμ§€ μ•ŠκΈ° λ•Œλ¬Έμ—, μžλ‘λŠ” ν•˜λ‚˜μ˜ λ‚˜λ¬΄ μ•„λž˜μ— μ„œ μžˆλ‹€κ°€ λ‹€λ₯Έ λ‚˜λ¬΄ μ•„λž˜λ‘œ λΉ λ₯΄κ²Œ(1μ΄ˆλ³΄λ‹€ 훨씬 짧은 μ‹œκ°„μ—) 움직일 수 μžˆλ‹€. ν•˜μ§€λ§Œ μžλ‘λŠ” 체λ ₯이 그닀지 쒋지 λͺ»ν•΄μ„œ 많이 움직일 μˆ˜λŠ” μ—†λ‹€.

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

 

μž…λ ₯

첫째 쀄에 두 μ •μˆ˜ T, Wκ°€ 주어진닀. λ‹€μŒ T개의 μ€„μ—λŠ” 각 μˆœκ°„μ— μžλ‘κ°€ λ–¨μ–΄μ§€λŠ” λ‚˜λ¬΄μ˜ λ²ˆν˜Έκ°€ 1 λ˜λŠ” 2둜 주어진닀.

 

좜λ ₯

첫째 쀄에 μžλ‘κ°€ 받을 수 μžˆλŠ” μžλ‘μ˜ μ΅œλŒ€ 개수λ₯Ό 좜λ ₯ν•œλ‹€.


λ™μ κ³„νšλ²•μ„ μ΄μš©ν•˜μ—¬ ν‘ΈλŠ” 문제.

 

μžλ‘κ°€ μ–΄λŠ λ‚˜λ¬΄μ—μ„œ λ–¨μ–΄μ§€λ˜ μžλ‘κ°€ ν˜„μž¬ μœ„μΉ˜μ—μ„œ 선택할 수 μžˆλŠ” 방법은 λ‘κ°€μ§€λ‘œ 좔릴 수 μžˆλ‹€.

 

1. μ΄λ™ν•œλ‹€.

2. μ΄λ™ν•˜μ§€ μ•ŠλŠ”λ‹€.

 

μ—¬κΈ°μ„œ ν˜„μž¬ μ‹œκ°„ i, 이동 횟수 j, ν˜„μž¬ μœ„μΉ˜ k λͺ¨λ‘λ₯Ό 관리할 3차원 λ°°μ—΄ count[i][j][k]λ₯Ό μ΄μš©ν•˜μ—¬ μ„Έμš΄ 식은 λ‹€μŒκ³Ό κ°™λ‹€.

 

count[i][j][1] = max(count[i - 1][j][1], count[i - 1][j - 1][2]) + (plum[i] == 1)

count[i][j][2] = max(count[i - 1][j - 1][1], count[i - 1][j][2]) + (plum[i] == 2)

 

κ·Έ ν›„ λ°°μ—΄ λ‚΄ κ°’ 쀑 κ°€μž₯ 큰 값이 κ²°κ³Όκ°€ λœλ‹€. 초기 값은 μžλ‘μ˜ 처음 μœ„μΉ˜κ°€ 1이기 λ•Œλ¬Έμ— count[1][0][1]κ³Ό count[1][1][2]만 μ΄ˆκΈ°ν™”ν•΄μ€€ λ’€ 문제λ₯Ό ν’€λ©΄ λœλ‹€.

 

μƒκ°ν•΄μ€„κ²Œ λ§Žμ•„ μ–΄λ €μ›Œμ„œ ... 많이 κ³ μƒν–ˆλ˜ λ¬Έμ œμ˜€λ‹€γ…œγ…œ

μ΄λ™νšŸμˆ˜λ₯Ό 쑰건문이 μ•„λ‹Œ λ°˜λ³΅λ¬Έμ„ 톡해 κ΄€λ¦¬ν•΄μ£ΌλŠ” 방법을 처음 λ΄μ„œ μ–΄λ €μ› λ‹€....

 

μ½”λ“œ
#include <cstdio>
#define MAX 1001

int plum[MAX][3];
int T, W;
int DP();

int max(int a, int b) {
    return (a > b ? a : b);
}
int main(void) {
    scanf("%d %d", &T, &W);

    for(int i = 1; i <= T; i++) {
        int num;
        scanf("%d", &num);
        plum[i][num] = 1;
    }

    printf("%d\n", DP());
    return 0;
}

int DP() {
    int result = 0; // μ΅œμ’… κ²°κ³Ό
    int count[MAX][32][3]; // μžλ‘ 개수 μ„ΈλŠ” λ°°μ—΄

    count[1][0][1] = plum[1][1];
    count[1][1][2] = plum[1][2];

    result = max(count[1][0][1], count[1][1][2]);

    for(int i = 2; i <= T; i++) {
        for(int j = 0; j <= W; j++) {
            count[i][j][1] = max(count[i - 1][j][1], count[i - 1][j - 1][2]) + plum[i][1];
            count[i][j][2] = max(count[i - 1][j - 1][1], count[i - 1][j][2]) + plum[i][2];

            result = max(max(result, count[i][j][1]), count[i][j][2]);
        }
    }

    return result;
}
Comments