다이나믹 프로그래밍

    효율적인 알고리즘을 위해 사용할 수 있는 기법. 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)

     

     

    Posted by 저본