[알고리즘] DP(Dynamic Programming) - 백준 17202 9655 2579 2156 2565 1967 3020
알고리즘
2023. 3. 4. 02:38
다이나믹 프로그래밍
효율적인 알고리즘을 위해 사용할 수 있는 기법. top-down(메모이제이션, 하향식) / bottom-up(상향식) 방식이 있다.
간단하게 설명하면 문제를 작은 문제부터 해결하여 큰 문제의 답을 도출하는 방식.
백준 17202 핸드폰 번호 궁합
a = list(input()) b = list(input()) data = [] for i in range(len(a)): data.append(a[i]) data.append(b[i]) dp = [0 for _ in range(15)] for i in range(len(data)-1): dp[i] = (int(data[i]) + int(data[i+1])) % 10 for i in range(14, 1, -1): for j in range(i): dp[j] = (dp[j] + dp[j+1]) % 10 ans = str(dp[0]) + str(dp[1]) print(ans)
백준 9655 돌 게임
n = int(input()) if n % 2 == 1: print('SK') else: print('CY')
엄..?
백준 2579 계단 오르기
n = int(input()) score = [] for _ in range(n): score.append(int(input())) dp = [0] * n if n <= 2: print(sum(score)) else: dp[0] = score[0] dp[1] = dp[0] + score[1] dp[2] = max(dp[0] + score[2], score[1] + score[2]) for i in range(3, n): dp[i] = max(dp[i-3] + score[i-1] + score[i], dp[i-2] + score[i]) print(dp[-1])
백준 2156 포도주 시식
n = int(input()) alcohol = [] for _ in range(n): alcohol.append(int(input())) dp = [0] * n if n <= 2: print(sum(alcohol)) else: dp[0] = alcohol[0] dp[1] = dp[0] + alcohol[1] dp[2] = max(dp[0] + alcohol[2], alcohol[1] + alcohol[2]) for i in range(3, n): dp[i] = max(dp[i-3] + alcohol[i-1] + alcohol[i], dp[i-2] + alcohol[i], dp[i-4] + alcohol[i-1] + alcohol[i]) print(max(dp))
백준 2565 전깃줄
n = int(input()) elec = [] for _ in range(n): a, b = map(int,input().split()) elec.append((a,b)) elec.sort(key = lambda x:x[0]) dp = [0] * n for i in range(n): dp[i] = 1 for j in range(i): if elec[j][1] < elec[i][1]: dp[i] = max(dp[i], dp[j] + 1) print(n - max(dp))
점화식 잘 세우는게 좀 어렵긴하다. 학생 때도 점화식 진짜 싫어했었는데 결국 만나게 되어버린...
백준 1967 트리의 지름
이거 넘 어렵다... 나중에 다시 봐야될듯 구글링 해서 풀었음
from collections import deque n = int(input()) graph = [[] for _ in range(n+1)] def bfs(start): visited = [-1] * (n+1) visited[start] = 0 q = deque() q.append(start) while q: c = q.popleft() for no, w in graph[c]: if visited[no] == -1: q.append(no) visited[no] = visited[c] + w m = max(visited) return [visited.index(m), m] for _ in range(n-1): start, end, weight = map(int, input().split()) graph[start].append([end, weight]) graph[end].append([start, weight]) print(bfs(bfs(1)[0])[1])
백준 3020 개똥벌레
머리가~ 안돌아가~
n, h = map(int, input().split()) up = [0] * (h+1) down = [0] * (h+1) for i in range(n): if i%2 == 0: down[int(input())] += 1 else: up[int(input())] += 1 for i in range(h-1, 0, -1): down[i] += down[i+1] up[i] += up[i+1] min_val = n min_cnt = 0 for i in range(1, h+1): x = down[i] + up[h-i + 1] if x < min_val: min_cnt = 1 min_val = x elif x == min_val: min_cnt += 1 print(min_val, min_cnt)
'알고리즘' 카테고리의 다른 글
[알고리즘] DFS/BFS - 백준 2644 4963 2667 7562 16234 (0) | 2023.03.06 |
---|---|
[알고리즘] 그리디 - 백준 1789 1449 11501 15903 2112 (0) | 2023.03.05 |
[알고리즘] 이진 탐색(Binary Search) - 백준 10816 2512 2805 16564 2467 1339 7576 (0) | 2023.03.01 |
[알고리즘] 정렬 - 백준 2750 1920 2108 1946 2470 1461 10026 (0) | 2023.02.28 |
[알고리즘] DFS / BFS + 백준 10828 10845 17478 1388 2606 1260 1325 2138 (0) | 2023.02.25 |