dp 22

[Python] 9252. LCS2

seq1 = input() # 문자열 1 seq2 = input() # 문자열 2 seq1_l = len(seq1) + 1 # 각 문자열의 길이 seq2_l = len(seq2) + 1 dp = [["" for _ in range(seq2_l)] for _ in range(seq1_l)] # LCS를 저장할 DP for i in range(1, seq1_l): for j in range(1, seq2_l): if seq1[i-1] == seq2[j-1]: # 방금 막 추가한 문자가 같다면 dp[i][j] = dp[i-1][j-1] + seq1[i-1] # 기존 문자열 + 방금 문자 else: # 같지 않다면 if len(dp[i-1][j]) < len(dp[i][j-1]): # 현재 dp의 좌측과 위의 ..

Algorithm/Baekjoon 2022.01.01

[Python] 9251. LCS

seq1 = input() # 문자열 1 seq2 = input() # 문자열 2 seq_l1 = len(seq1) + 1 # 1번 문자열의 길이 seq_l2 = len(seq2) + 1 # 2번 문자열의 길이 dp = [[0 for _ in range(seq_l2)] for _ in range(seq_l1)] for i in range(1, seq_l1): # dp 배열 행열에 맞춰서(seq1-행, seq2-열) for문 선언 for j in range(1, seq_l2): if seq1[i-1] == seq2[j-1]: # 가장 최근에 추가된 글자가 같다면 dp[i][j] = dp[i-1][j-1] + 1 # 글자가 추가되기 전, 최대 길이 + 1 else: # 다르다면 dp[i][j] = max(d..

Algorithm/Baekjoon 2021.12.16

[Python] 12865. 평범한 배낭

n, k = map(int, input().split()) # 물품의 수 n, 버틸 수 있는 무게 k arr = [[0, 0]] + [list(map(int, input().split())) for _ in range(n)] # [물건의 무게, 물건의 가치] dp = [[0 for _ in range(k+1)] for _ in range(n+1)] for i in range(1, n+1): w = arr[i][0] # 현재 물건의 무게 v = arr[i][1] # 현재 물건의 가치 for j in range(1, k+1): if j < w: # 무게 j보다 현재 물건의 무게가 더 무겁다면 dp[i][j] = dp[i-1][j] # 바로 이전 물건, 같은 무게로 채우기 else: # 무게 j보다 현재 물건..

Algorithm/Baekjoon 2021.12.16

[Python] 1952. 수영장

tc = int(input()) for idx in range(1, tc+1): charge = list(map(int, input().split())) # 1일, 1달, 3달, 1년 plan = list(map(int, input().split())) # 1월부터 12월까지의 이용 계획 dp = [0 for _ in range(12)] for i in range(12): dp[i] = dp[i-1] + min(plan[i] * charge[0], charge[1]) # 이전 달의 요금 + (1일 이용권으로 계산 vs 1달 이용권으로 계산) if i > 1: # 3달 이상 됐다면 dp[i] = min(dp[i], dp[i-3] + charge[2]) # 3달 이용권으로 할까 말까 print('#{} {}..

[Python] 9495. 스티커

tc = int(input()) for _ in range(tc): n = int(input()) # 한 라인의 스티커 개수 dp = [list(map(int, input().split())) for _ in range(2)] # 주어진 스티커 배열 if n > 1: dp[0][1] += dp[1][0] # 점화식에 i-2가 있기때문에 처음 값은 직접 더해준다. (현재자리의 왼쪽 대각선자리) dp[1][1] += dp[0][0] for i in range(2, n): # 선택할 수 있는 두 자리에 있는 점수 중, 큰 점수와 현재 스티커와 더해주기 dp[0][i] += max(dp[1][i-2], dp[1][i-1]) dp[1][i] += max(dp[0][i-2], dp[0][i-1]) print(max..

Algorithm/Baekjoon 2021.09.30

[Python] 1463. 1로 만들기

n = int(input()) dp = [0 for _ in range(n+1)] for i in range(2, n+1): dp[i] = dp[i-1] + 1# 1번 if i % 3 == 0:# 2번 dp[i] = min(dp[i], dp[i//3]+1) if i % 2 == 0:# 3번 dp[i] = min(dp[i], dp[i//2]+1) print(dp[n]) dp 리스트 안의 i 자리에는 숫자 i를 1로 만들기 위한 주어진 연산을 사용하는 횟수의 최솟값이 담기게 된다. 따라서 2부터 시작하여 (1은 연산할 필요가 없으므로 0) n까지 저장하는 dp를 이용하여 문제를 풀어야 한다. dp[i]에 이전의 숫자(i-1)에서 구한 연산 사용 횟수 +1을 저장한다. 예) i = 10이라면 dp[9] = 2..

Algorithm/Baekjoon 2021.09.28