algorithm

BOJ 14501

rkawk 2022. 9. 25. 22:42
더보기

퇴사 μ„±κ³΅

 

μƒλ‹΄μ›μœΌλ‘œ μΌν•˜κ³  μžˆλŠ” λ°±μ€€μ΄λŠ” 퇴사λ₯Ό ν•˜λ €κ³  ν•œλ‹€.

μ˜€λŠ˜λΆ€ν„° N+1일째 λ˜λŠ” λ‚  퇴사λ₯Ό ν•˜κΈ° μœ„ν•΄μ„œ, 남은 N일 λ™μ•ˆ μ΅œλŒ€ν•œ λ§Žμ€ 상담을 ν•˜λ €κ³  ν•œλ‹€.

λ°±μ€€μ΄λŠ” λΉ„μ„œμ—κ²Œ μ΅œλŒ€ν•œ λ§Žμ€ 상담을 작으라고 뢀탁을 ν–ˆκ³ , λΉ„μ„œλŠ” ν•˜λ£¨μ— ν•˜λ‚˜μ”© μ„œλ‘œ λ‹€λ₯Έ μ‚¬λžŒμ˜ 상담을 μž‘μ•„λ†“μ•˜λ‹€.

각각의 상담은 상담을 μ™„λ£Œν•˜λŠ”λ° κ±Έλ¦¬λŠ” κΈ°κ°„ Ti와 상담을 ν–ˆμ„ λ•Œ 받을 수 μžˆλŠ” κΈˆμ•‘ Pi둜 이루어져 μžˆλ‹€.

N = 7인 κ²½μš°μ— λ‹€μŒκ³Ό 같은 상담 μΌμ •ν‘œλ₯Ό 보자.

 1일2일3일4일5일6일7일TiPi
3 5 1 1 2 4 2
10 20 10 20 15 40 200

1일에 μž‘ν˜€μžˆλŠ” 상담은 총 3일이 걸리며, μƒλ‹΄ν–ˆμ„ λ•Œ 받을 수 μžˆλŠ” κΈˆμ•‘μ€ 10이닀. 5일에 μž‘ν˜€μžˆλŠ” 상담은 총 2일이 걸리며, 받을 수 μžˆλŠ” κΈˆμ•‘μ€ 15이닀.

상담을 ν•˜λŠ”λ° ν•„μš”ν•œ 기간은 1일보닀 클 수 있기 λ•Œλ¬Έμ—, λͺ¨λ“  상담을 ν•  μˆ˜λŠ” μ—†λ‹€. 예λ₯Ό λ“€μ–΄μ„œ 1일에 상담을 ν•˜κ²Œ 되면, 2일, 3일에 μžˆλŠ” 상담은 ν•  수 μ—†κ²Œ λœλ‹€. 2일에 μžˆλŠ” 상담을 ν•˜κ²Œ 되면, 3, 4, 5, 6일에 μž‘ν˜€μžˆλŠ” 상담은 ν•  수 μ—†λ‹€.

λ˜ν•œ, N+1μΌμ§Έμ—λŠ” νšŒμ‚¬μ— μ—†κΈ° λ•Œλ¬Έμ—, 6, 7일에 μžˆλŠ” 상담을 ν•  수 μ—†λ‹€.

퇴사 전에 ν•  수 μžˆλŠ” μƒλ‹΄μ˜ μ΅œλŒ€ 이읡은 1일, 4일, 5일에 μžˆλŠ” 상담을 ν•˜λŠ” 것이며, μ΄λ•Œμ˜ 이읡은 10+20+15=45이닀.

상담을 적절히 ν–ˆμ„ λ•Œ, 백쀀이가 얻을 수 μžˆλŠ” μ΅œλŒ€ μˆ˜μ΅μ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 N (1 ≤ N ≤ 15)이 μ£Όμ–΄μ§„λ‹€.

λ‘˜μ§Έ 쀄뢀터 N개의 쀄에 Ti와 Piκ°€ 곡백으둜 κ΅¬λΆ„λ˜μ–΄μ„œ μ£Όμ–΄μ§€λ©°, 1일뢀터 NμΌκΉŒμ§€ μˆœμ„œλŒ€λ‘œ μ£Όμ–΄μ§„λ‹€. (1 ≤ Ti ≤ 5, 1 ≤ Pi ≤ 1,000)

좜λ ₯

첫째 쀄에 백쀀이가 얻을 수 μžˆλŠ” μ΅œλŒ€ 이읡을 좜λ ₯ν•œλ‹€.

예제 μž…λ ₯ 1 λ³΅μ‚¬

7
3 10
5 20
1 10
1 20
2 15
4 40
2 200

예제 좜λ ₯ 1 λ³΅μ‚¬

45​

그리디 μ•„λ‹ˆλ©΄ λ””ν”Ό 문제라고 μƒκ°ν•˜κ³ μžˆμ—ˆλŠ”λ° μž‘μ—…(상담) μŠ€μΌ€μ€„λ§μœΌλ‘œ ν’€κΈ°μ—λŠ” μž‘μ—… ν•˜λ‚˜ν•˜λ‚˜μ— κ°€μ€‘μΉ˜(κΈˆμ•‘)κ°€ μžˆμœΌλ―€λ‘œ λ””ν”Όλ‘œ κ΅¬ν˜„ν–ˆλ‹€.

 

2차원 배열을 λ§Œλ“€μ–΄ 행은 상담 정보, 열은 λ‚ μ§œλ‘œ λ§Œλ“€μ–΄μ„œ κ±Έλ¦¬λŠ” μ‹œκ°„λ§ŒνΌ κΈˆμ•‘μ„ λ„£μ–΄μ£Όκ³ , μž‘μ—…μ΄ μŒ“μž„μ— 따라 λ‹€λ₯Έ λ°°μ—΄ 값을 λ°”κΎΈμ–΄ μ£Όμ–΄ μ΅œλŒ“κ°’μ„ 톡해 닡을 κ΅¬ν•˜κ²Œ ν–ˆλ‹€. 말둜 μ„€λͺ…ν•˜λ‹ˆ μ–΄λ €μš΄κ±° κ°™λ‹€.

 

예λ₯Όλ“€μ–΄ 

3 10

2 20

3 30

4 100μ΄λΌλŠ” μž…λ ₯이 λ“€μ–΄μ˜€λ©΄

 

10 10 10    
  20 20    
    30 30 30
      100  

이런 λͺ¨μ–‘μ˜ ν…Œμ΄λΈ”μ„ λ§Œλ“€μ–΄ μ£Όκ³ 

 

νŠΉμ • 상담이 μ‹œμž‘ν•˜λŠ” μˆœκ°„μ€ λ‚ μ§œμ™€ κ°™μœΌλ―€λ‘œ 

1 ~ 상담이 μ‹œμž‘ν•˜λŠ” μˆœκ°„(D) -> board[ 1~D-1 ][ D ] 의 값이 0이면 이전에 μˆ˜ν–‰ν•  수 μžˆλŠ” 상담이기 λ•Œλ¬Έμ— 이 값을 더해주어 λ‹€λ₯Έ 배열에 λ„£μ–΄μ£Όμ—ˆλ‹€.

 

1일차 상담뢀터 λκΉŒμ§€ μˆœμ„œλŒ€λ‘œ μ§„ν–‰ν–ˆκΈ° λ•Œλ¬Έμ— 순차적으둜 μ €μž₯ν•˜λ©΄μ„œ ꡬ해주면 λœλ‹€.

#include <iostream>
using namespace std;
int N, board[16][16], va[16], ans[16], an;
//va -> μ›λž˜ 상담 λΉ„μš© ans -> dp
int main(){
    cin>>N;
    for(int i=1; i<=N; i++){
        int dist, value;
        cin>>dist>>value;
        if(i+dist-1 > N) continue;
        va[i] = value;
        ans[i] = value;
        for(int j=i; j<i+dist; j++){
            board[i][j] = value;
        }
    }
    for(int i=2; i<=N; i++){
        for(int j=1; j<i; j++){
            if(board[j][i]) continue; // 같이 μˆ˜ν–‰ν•  수 μ—†λŠ” 상담
            ans[i] = max(ans[i] ,max(va[i] + ans[j], va[i] + va[j]));
        }
    }
    
    for(int i=1; i<=N; i++){
        an = max(an, ans[i]);
    }
    cout<<an;
}

 

 

λ‹€ν’€κ³  λ„ˆλ¬΄ μ–΄λ ΅κ²Œ ν‘Όκ±°κ°™μ•„μ„œ λ‹€λ₯Έ 풀이λ₯Ό μ°Ύμ•„λ³΄λ‹ˆ λ’€μ—μ„œλΆ€ν„° κ·Έλƒ₯ κ³„μ‚°ν•˜λ©΄ λœλ‹¨λ‹€.. 

 

 

'algorithm' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

BOJ 17609  (0) 2022.09.27
BOJ 1707  (0) 2022.09.27
BOJ 1967  (1) 2022.09.25
BOJ 1238  (0) 2022.09.17
BOJ 1504  (0) 2022.09.15