1. Problem
2. Others' Solutions
import sys
n = int(sys.stdin.readline().rstrip())
dp = [0] * 31
dp[2] = 3
for i in range(4,31):
if i % 2 == 0:
dp[i] += dp[i-2]*3 # 고정된 3가지의 모양
for j in range(i-4,0,-2):
dp[i] += dp[j] * 2 # 지금까지 나타난 특이한 모양
dp[i] += 2 # 추가적으로 생겨난 특이한 모양
print(dp[n])
3. Learned
1. Problem
2. Others' Solutions
import sys
import math
n = int(sys.stdin.readline().rstrip())
dp = [[0,0,0] for _ in range(n)]
color = []
result = math.inf
for i in range(n): # 집 마다 RGB color 값 입력 받음
color.append(list(map(int,sys.stdin.readline().rstrip().split())))
for i in range(3):
for j in range(3): # 첫 번째 집에서 R,G,B 중에 하나를 택하고 나머지는 inf 값으로 선택되지 않게 설정
if i == j:
dp[0][j] = color[0][j]
else:
dp[0][j] = math.inf
for k in range(1,n): # RGB 거리 문제와 동일하게 dp를 이용하여 최솟값 도출
dp[k][0] = min(dp[k-1][1] + color[k][0], dp[k-1][2] + color[k][0])
dp[k][1] = min(dp[k-1][0] + color[k][1], dp[k-1][2] + color[k][1])
dp[k][2] = min(dp[k-1][0] + color[k][2], dp[k-1][1] + color[k][2])
for j in range(3): # 첫 번째 집과 색이 같은 경우를 제외한 결과중에 min 값 결정
if i == j:
continue
else:
result = min(result, dp[n-1][j])
print(result)
3. Learned