(전공복습) 데이터과학 4. 시각화
차례
1차원 dp를 활용하는 문제.
dp[i]
를 i
번째 문자열까지의 가장 작은 팰린드롬 분할 수를 구하는 문제라고 했을 때,
점화식은 dp[i] = min(dp[i], dp[j-1] + 1)
로 나타난다. (이때, j
는 팰린드롬인지 검사할 문자열의 시작점.)
팰린드롬 검사 코드가 조금 지저분한데, 처음에 방향을 잘못 잡아서 그렇다.
#!python
string = input()
n = len(string)
cand = [[0 for _ in range(n)] for _ in range(2)]
# 팰린드롬 여부를 구하는 코드
# cand[0][i]는 i번째 문자를 중심으로 하는 홀수 길이 팰린드롬 문자열의 최대 반지름
# cand[1][i]는 i번째 문자를 중심으로 하는 짝수 길이 팰린드롬 문자열의 최대 반지름
for i, char in enumerate(string):
for j in range(i, n):
if char == string[j]:
cand[(i+j)%2][(i+j)//2] += 1
else:
cand[(i+j)%2][(i+j)//2] = 0
# dp[i]는 i번째 문자까지의 팰린드롬 분할 정답
dp = [float('inf') for _ in range(n + 1)]
dp[-1] = 0
for i in range(n):
for j in range(i + 1):
# if문의 코드가 복잡해 보이지만 단순히 i에서 j까지의 문자열이 팰린드롬인지 여부를 검사할 뿐이다
if cand[(i+j)%2][(i+j)//2] * 2 - 1 + (i+j)%2 >= i - j + 1:
dp[i] = min(dp[i], dp[j-1] + 1)
print(dp[-2])
문제 링크 문제 링크
개요 선형적인 자료구조에서는 값에 접근하는 데에 \(O(1)\)이면 충분하지만, 대신 부분합을 구하는 데에는 \(O(N)\)이 필요하다. 그렇다면 이 자료구조를 이진 트리로 구성하면 어떨까? 값에 접근하는 데에 걸리는 시간이 \(O(\lg N)\)으로 늘어나지만 대신 부분합을 구하...
개요 다익스트라 알고리즘과 함께 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 다익스트라 알고리즘보다 느리지만, 음수 가중치 간선이 있어도 작동하며, 음수 가중치 사...
개요 다익스트라 알고리즘은 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘 중 하나이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 단, 다익스트라 알고리즘은 음수 가중치 엣지를 허용하지 않는다. 이 경우에는 벨만-...