6W.3D-DP

Dazz_heyDay ·2021년 8월 4일
2

Python) Algorithm_study

목록 보기
32/39

✏️문제[금광]

n × m 크기의 금광이 있다. 금광은 1 × 1 크기의 칸으로 나누어져 있으며, 각 칸은 특정한 크기의 금이 들어 있다. 채굴자는 첫 번째 열부터 출발하여 금을 캐기 시작한다. 맨 처음에는 첫 번째 열의 어느 행에서든 출발할 수 있다.
이후에 m - 1번에 걸쳐서 매번 오른쪽 위, 오른쪽, 오른쪽 아래 3가지 중 하나의 위치로 이동해야 한다.결과적으로 채굴자가 얻을 수 있는 금의 최대 크기를 출력하는 프로그램을 작성하라

금광위치
왼쪽 위에서,왼쪽 아래에서,왼쪽에서 ->3가지 중 장 많은 금을 가지고 있는 경우를 테이블에 대입

Test_case= int(input())
for _ in range(Test_case):
    n, m = map(int, input().split())
    tmp = list(map(int, input().split()))
    gold = []
    for i in range(0, n*m, m):
        gold.append(list(tmp[i:i+m]))

    base = [[0] * m for _ in range(n)]

    for i in range(n):
        base[i][0] = gold[i][0]

    for j in range(1,m):
        for i in range(n):
            now = gold[i][j]
            if i - 1 < 0:
                base[i][j] = max(base[i][j-1] + now, base[i+1][j-1] + now)
            elif i + 1 > n - 1:
                base[i][j] = max(base[i-1][j-1] + now, base[i][j-1] + now)
            else:
                base[i][j] = max(base[i-1][j-1] + now, base[i][j-1] + now, base[i+1][j-1] + now)

    result = 0
    for i in range(n):
        if base[i][-1] > result:
            result = base[i][-1]

    print(result)

✏️문제[정수 삼각형]

https://programmers.co.kr/learn/courses/30/lessons/43105

def f(IntT):
	for i in range(1,len(IntT)):
    		for j in range(1+i):
            	if j==i:
            		IntT[i][j]+=IntT[i-1][j-1]
                elif j==0:
            		IntT[i][j]+=IntT[i-1][j]
            	else:
            		IntT[i][j]+=max(IntT[i-1][j],IntT[i-1][j-1])
        return max(IntT[-1])
                

✏️문제[퇴사]

https://www.acmicpc.net/problem/14501

상담원으로 일하고 있는 백준이는 퇴사를 하려고 한다.
오늘부터 N+1일째 되는 날 퇴사를 하기 위해서, 남은 N일 동안 최대한 많은 상담을 하려고 한다.
백준이는 비서에게 최대한 많은 상담을 잡으라고 부탁을 했고, 비서는 하루에 하나씩 서로 다른 사람의 상담을 잡아놓았다.
각각의 상담은 상담을 완료하는데 걸리는 기간 Ti와 상담을 했을 때 받을 수 있는 금액 Pi로 이루어져 있다.
N = 7인 경우에 다음과 같은 상담 일정표를 보자.

1일 2일 3일 4일 5일 6일 7일
Ti 3 5 1 1 2 4 2
Pi 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이다.
상담을 적절히 했을 때, 백준이가 얻을 수 있는 최대 수익을 구하는 프로그램을 작성하시오.

import sys
readline = sys.stdin.readline

N = int(readline())
T, P = [], []
for _ in range(N):
    t, p = map(int, readline().split())
    T.append(t)
    P.append(p)

d = [0] * (N+1)

for i in range(N - 1, -1, -1):
    #  퇴사일을 넘기면 상담 안 함
    if i + T[i] > N:
        d[i] = d[i+1]
    else:
        # 상담을 하는 것, 상담을 안하는 것 중 선택
        d[i] = max(d[i+1], P[i] + d[i + T[i]])

print(d[0])

import sys
n=int(input())
t,p=[],[]
DP=[0]*(n+1)
for i in range(n):
	tmp=[int(i) for i in sys.stdin.readline().split()]
    t.append(tmp[0])
    p.append(tmp[1])
Max_c=0
for i in range(n):
	Max_c=max(Max_c,dp[i])
    if i+t[i]>n:
    	continue
    DP[i+t[i]]=max(Max_c+p[i], DP[i+t[i]])
print(max(DP))

점화식 : dp[i+t[i]]=max(Max_c+p[i], DP[i+t[i]]

참고 블로그 : https://copy-driven-dev.tistory.com/entry/백준Python1450115486DP퇴사-퇴사2


profile
Why.Not.Now

3개의 댓글

comment-user-thumbnail
2021년 8월 4일

안녕하세요 😊입니다! 저는 문제 해결 아이디어가 도통 잘 안떠오르네요,, 떠오르더라도 코드가 구현이 안되고.. 문제랑 코드 보고 많이 배워가요👍 오늘 수고 많으셨습니다!

답글 달기
comment-user-thumbnail
2021년 8월 5일

안녕하세요, 김덕우입니다. 저는 점화식은 이해가 가는데 그걸 코드로 구현하는게 너무 어렵더라고요.. 어제도 너무 수고하셨습니다, 오늘도 화이팅입니다!!

답글 달기
comment-user-thumbnail
2021년 8월 5일

안녕하세요 알고리줌입니다!
다이나믹은 역시 점화식을 먼저 생각하는게 포인트인것같네요..!
오늘 수고많으셨습니다!

답글 달기