Henu
개발냥발
Henu
전체 방문자
오늘
어제
  • 분류 전체보기 (411)
    • DevOps (52)
      • Kubernetes (19)
      • Docker (14)
      • AWS (3)
      • Nginx (4)
      • Linux (4)
      • ArgoCD (1)
      • CN (2)
      • NATS (0)
      • Git (5)
    • Back-End (30)
      • Django (18)
      • Spring (5)
      • JPA (1)
      • MSA (5)
    • CS (87)
      • SystemSoftware (20)
      • OS (25)
      • Computer Architecture (16)
      • Network (23)
      • Database (2)
    • Lang (21)
      • Java (9)
      • Python (4)
      • C# (8)
    • Life (12)
    • 블록체인 (2)
    • Algorithm (204)
      • BOJ (160)
      • 프로그래머스 (19)
      • LeetCode (4)
      • SWEA (1)
      • 알고리즘 문제 해결 전략 (8)
      • DS, algorithms (7)
      • Checkio (5)
    • IT (2)

블로그 메뉴

  • GitHub
  • 글쓰기
  • 관리자

공지사항

  • Free!

인기 글

태그

  • BFS
  • 다이나믹 프로그래밍
  • 프로그래머스
  • Network
  • DFS
  • 백트래킹
  • boj
  • docker
  • django
  • Kubernetes

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Henu

개발냥발

[백준 2240] 자두나무 C++
Algorithm/BOJ

[백준 2240] 자두나무 C++

2021. 6. 6. 08:00
 

2240번: 자두나무

자두는 자두를 좋아한다. 그래서 집에 자두나무를 심어두고, 여기서 열리는 자두를 먹고는 한다. 하지만 자두는 키가 작아서 자두를 따먹지는 못하고, 자두가 떨어질 때까지 기다린 다음에 떨어

www.acmicpc.net

다이나믹 프로그래밍


 

1. 문제해결 아이디어

cnt초가 지났고, s번 움직였고, 사람 자두가 loc에 있을 때의 최댓값을 메모이제이션 해주었다.

 

사람의 위치가 그대로 라면 cnt가 T가 되기 전까지 진행이 가능하다.

사람의 위치를 바꾼다면 s가 W가 되기 전까지 위치를 바꿀 수 있다.

 

현재 위치에 따라서 자두를 먹는지, 못 먹는지를 판단해서 결과에 1을 더할지 말지를 결정한다.


2. 코드

top-down 방식으로 구현

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
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <cstring>
using namespace std;
 
int T, W;
int jadu[1001], dp[1001][31][2];    // [시간][움직인 횟수][사람 자두의 위치]
 
int solve(int cnt, int s, int loc){
    if(cnt >= T) return 0;
    
    int &ret = dp[cnt][s][loc];
    if(ret != -1) return ret;
    
    int a = solve(cnt+1, s, loc);
    int b = 0;
    if(jadu[cnt] == loc) a += 1;
    
    if(s < W){
        b = solve(cnt+1, s+1, 1 - loc);
        if(jadu[cnt] == 1 - loc) b += 1;
    }
    
    ret = max(ret, max(a, b));
    
    return ret;
}
 
int main(){
    cin >> T >> W;
    for(int i = 0; i < T; i++){
        cin >> jadu[i];
        jadu[i] -= 1;
    }
    memset(dp, -1, sizeof(dp));
    
    cout << solve(0, 0, 0);
    
    return 0;
}
 
Colored by Color Scripter
cs

 

'Algorithm > BOJ' 카테고리의 다른 글

[백준 1328] 고층 빌딩 C++  (0) 2021.06.07
[백준 4811] 알약 C++  (0) 2021.06.06
[백준 14442] 벽 부수고 이동하기2 C++  (2) 2021.06.06
[백준 1007] 벡터 매칭 C++  (0) 2021.06.05
[백준 1005] ACM Craft C++  (0) 2021.06.03
    'Algorithm/BOJ' 카테고리의 다른 글
    • [백준 1328] 고층 빌딩 C++
    • [백준 4811] 알약 C++
    • [백준 14442] 벽 부수고 이동하기2 C++
    • [백준 1007] 벡터 매칭 C++

    티스토리툴바