① 조합 계산 방법
import math
math.comb(N, K)
② DP 테이블 초기화 및 업데이트
# N을 행으로, K를 열로 하는 테이블을 생성한다.
D = [[0 for col in range(N + 1)] for row in range(N + 1)]
# 테이블 초기화
for i in range(N + 1):
D[i][0] = 1
D[i][1] = i
D[i][i] = 1
# 점화식을 이용하여 테이블 값 업데이트
for i in range(3, N + 1): # N >= 3인 경우에만 업데이트 발생
for j in range(1, i): # K는 N보다 클 수 없다.
D[i][j] = D[i-1][j] + D[i-1][j-1]
③ 완전 순열의 DP 테이블
D[2] = 1
에서 IndexError가 발생한다.D = [0 for _ in range(1000001)]
D[1] = 0
D[2] = 1
for n in range(3, N + 1):
D[n] = (n - 1) * (D[n - 2] + D[n - 1])
① DP 적용 조건
② 주의 사항
③ 최적 값의 위치를 알 수 없는 경우
① 카데인 알고리즘
② LCS 알고리즘
③ 연쇄 행렬 곱셈
# N은 행렬의 개수
# lst는 행렬의 행과 열을 저장하고 있는 배열
D = [[sys.maxsize for i in range(N)] for j in range(N)] # 최소 값을 구할 때는 maxsize로 초기화
for i in range(N): # D[i][j]에서 i == j이면, 행렬이 하나라는 의미이므로 필요한 연산의 수는 0이 됨.
D[i][i] = 0
for cnt in range(2, N + 1): # i와 j 사이의 존재하는 행렬의 개수(i와 j 행렬도 포함)
for i in range(N - cnt + 1):
j = i + cnt - 1
for k in range(i, j):
D[i][j] = min(D[i][k] + D[k + 1][j] + lst[i][0] * lst[k][1] * lst[j][1], D[i][j])
print(D[0][N - 1]) # 인덱스가 0부터 시작하므로, 0번 행렬부터 N-1번 행렬까지의 최소 연산 횟수로 구해야 함.
④ TSP 알고리즘
① CCW 계산 방법
② CCW의 의미
③ 다각형의 넓이
④ 코드
def CCW(x1, y1, x2, y2, x3, y3):
ccw = (x1 * y2 + x2 * y3 + x3 * y1) - (x2 * y1 + x3 * y2 + x1 * y3)
if ccw > 0 :
return 1
elif ccw == 0:
return 0
else:
return -1