1. Problem
2. Others Solutions
import sys
n, k = map(int,sys.stdin.readline().rstrip().split())
dp = [[0]*(k+1) for _ in range(n)]
coin = []
answer = 0
for _ in range(n):
coin.append(int(sys.stdin.readline()))
for i in range(n):
for q in range(i+1):
for j in range(coin[i],k+1):
if j-coin[i] == 0:
dp[i][j] = 1
else:
dp[i][j] += dp[q][j - coin[i]]
for i in range(n):
answer += dp[i][k]
print(answer)
import sys
n, k = map(int,sys.stdin.readline().rstrip().split())
dp = [0] * (k+1)
coin = []
for _ in range(n):
coin.append(int(sys.stdin.readline()))
for i in range(n):
for cost in range(coin[i],k+1):
# cost 가 자기 자신일 때
if cost-coin[i] == 0:
dp[cost] += 1
else:
dp[cost] += dp[cost - coin[i]]
print(dp[k])
3. Learned
1. Problem
2. My Solution
두 문자열 X,Y 에 대한 최장공통부분순서는 아래와 같은 정리를 따른다
- xm = yn 이면 LCS의 길이는 Xm-1 과 Yn-1 의 LCS 길이보다 1 크다.
- xm != yn 이면 LCS의 길이는 Xm 과 Yn-1의 LCS 길이, Xm-1 과 Yn의 LCS 길이 중 큰 것과 같다
2차원 dp[i][j] 를 이용함 (i = X의 문자열길이, j = Y의 문자열길이)
3가지 경우로 나눌 수 있음
- i or j == 0 인 경우
- X[i] == Y[j] 인 경우
- X[i] != Y[j] 인 경우
# dp[i][j] -> i = 문자열 X에서 i번째까지 판단할 때(i번째가 마지막원소)
# -> j = 문자열 Y에서 j번째까지 판단할 때(j번째가 마지막원소)
# 0번째는 문자열이 없을 때를 나타냄. 따라서 1번부터 시작하면 됨
import sys
X = " " + sys.stdin.readline().rstrip()
Y = " " + sys.stdin.readline().rstrip()
dp = [[0] * len(Y) for _ in range(len(X))]
for i in range(len(X)):
dp[i][0] = 0
for i in range(len(Y)):
dp[0][i] = 0
for i in range(1,len(X)):
for j in range(1,len(Y)):
if X[i] == Y[j]:
dp[i][j] = dp[i-1][j-1]+1
else:
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
print(dp[len(X)-1][len(Y)-1])
3. Learned
1. Problem
2. My Solution
import sys
test_n = int(sys.stdin.readline())
for _ in range(test_n):
n,m = map(int,sys.stdin.readline().rstrip().split())
dp = [[0]* (m+1) for _ in range(n+1)]
for i in range(1,m+1):
dp[1][i] = i
for i in range(1,n+1):
dp[i][i] = 1
for i in range(2,n+1):
for j in range(2,m+1):
dp[i][j] = dp[i][j-1] + dp[i-1][j-1]
print(dp[n][m])
3. Learned
1. Problem
2. My Solution
(n-1,m),(n,m-1),(n-1,m-1)
중에서 (n,m) 으로 한칸 이동한 것임. 따라서 (n-1,m),(n,m-1),(n-1,m-1) 까지 최대의 사탕을 획득하는 경로에 (n,m)에 존재하는 사탕을 더하는 최적구분구조를 보이므로 dp 를 이용하여 해결import sys
n,m = map(int,sys.stdin.readline().rstrip().split())
dp = [[0]* (m+1) for _ in range(n+1)]
miro = []
for _ in range(n):
miro.append(list(map(int,sys.stdin.readline().rstrip().split())))
for i in range(1,n+1):
for j in range(1,m+1):
dp[i][j] = max(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + miro[i-1][j-1]
print(dp[n][m])
1. Problem
2. Others' Solutions
import sys
import math
test_n = int(sys.stdin.readline())
for _ in range(test_n):
n = int(sys.stdin.readline())
files = list(map(int,sys.stdin.readline().rstrip().split()))
dp = [[0] * n for _ in range(n)]
for j in range(1,n):
for i in range(j-1, -1, -1):
small = math.inf
for k in range(j-i):
small = min(small, dp[i][i+k] + dp[i+k+1][j])
dp[i][j] = small + sum(files[i:j+1])
print(dp[0][n-1])
3. Learned
1. Problem
2. Others' Solutions
import sys
n = int(sys.stdin.readline())
lis = []
max_line = 0
for _ in range(n):
a,b = map(int,sys.stdin.readline().rstrip().split())
lis.append([a,b,1])
lis.sort(key=lambda x:x[0])
for i in range(n):
max_val = 0
for j in range(i):
if lis[j][1] < lis[i][1]:
max_val = max(max_val, lis[j][2])
lis[i][2] = max_val+1
max_line = max(max_line, max_val+1)
print(n - max_line)
3. Learned