Eau de Cologne
문제 https://www.acmicpc.net/problem/21853 풀이 (Subtask 4) 더보기 k를 고정하고, Tree-DP를 사용합니다. 정점 v에서, 서브트리가 조건을 만족하고, v는 자식 정점과 연결되는 간선을 k−1개 이하가 되도록 할 때 가중치 합의 최솟값을 Av라고 합시다. v에 대한 추가 조건이 없는 경우의 가중치 합의 최솟값을 Bv라고 합시다. 정점 v를 고정하고, v의 자식 정점의 집합을 S라고 합시다. 또한 w(a,b)를 a와 b를 잇는 간선의 가중치라고 합시다. v와 연결할 자식 정점의 집합을 T라고 합시다. 해당 자식 정점은, 부모와 이미 간선 1개가 이어져있기 때문에, k−1개의 간선만 이을 수 있습니다..
문제: https://atcoder.jp/contests/abc309/tasks/abc309_h 풀이: 더보기 O(NM) 에 문제를 해결하는 것은 쉽습니다. Dr,c 를 A1,⋯,AK에서 출발해서 (r,c)로 도달하는 경우라고 합시다. 답은 DN,B1+⋯+DN,BL입니다. D1,c 는 Ai에서 c가 등장하는 횟수입니다. (1≤c≤M) Dr,c=Dr−1,c−1+Dr−1,c+Dr−1,c+1입니다. (1≤c≤M) 단, Dr,0 와 Dr,M+1 은 항상 0으로 가정합니다. 이제 이를 다항식 형태로 바꿔봅시다. $D..
문제: https://www.acmicpc.net/problem/8249 풀이: 더보기 정점을 무한히 일직선으로 폅시다. 이 때, v라는 정점은 지구를 동쪽으로 r바퀴 돌았는지의 여부와 함께 (v,r)이라는 정점으로 바뀝니다. 좀 더 엄밀히 말해서 경도 0인 기준선을 서->동 방향으로 몇 번 지났는지라고 생각합시다. wb−wa의 부호가 k와 같으면 경도 0 기준선을 지나지 않습니다. 즉 (a,r)↔(b,r) 간선이 됩니다. 만약 다르면 기준선을 지납니다. 즉, a↔b 간선은 (a,r)↔(b,r+k) 간선이 됩니다. 이제 (1,0) 에서 (1,r) $(r \n..
문제: https://www.acmicpc.net/problem/23603 풀이: 더보기 Zeckendorf's Theorem을 살펴봅시다. Zeckendorf's Theorem: 모든 양의 정수는 인접하지 않은 서로 다른 피보나치 수의 합으로 유일하게 표현할 수 있다. (Zeckendorf Representation) 예를 들면, 64=55+8+1 처럼 인접하지 않은 피보나치 수의 합으로 유일하게 표현할 수 있습니다. 가령, 64=55+5+3+1 같은 표기법은 5와 3이 인접하게 됩니다. 이제 이 방식이 최소 개수의 항을 쓴 피보나치 합이라는것을 증명합시다. Claim: 양의 정수를 최소 개수의 피보나치 수의 합으로 표현하는 방법은, Zeckendorf Repre..
문제: https://www.acmicpc.net/problem/26305 풀이: 더보기 길이가 4 이상인 palindrome이 있으면, 앞 뒤에 두 문자를 떼어낸 문자열도 palindrome입니다. 그러므로, 우리는 길이 2 혹은 3의 palindrome이 생기지 않도록 유지해주기만 하면 됩니다. DP의 상태를 현재 위치 (r,c)와, 현재 위치에 오기 전에 방문했던 문자 p 로 저장합니다. (r,c,p)→(nr,nc,np) 로의 transition은 |r−nr|+|c−nc|=1 이고, A[r,c]=np 이며, A[nr,nc] 가 p와 A[r,c] 모두와 다를 때 이루어지게 ..
문제: https://www.acmicpc.net/problem/14399 풀이: 더보기 X연산을 시행한 이후에는 X>Y, Y연산을 시행한 이후에는 Y>X를 만족합니다. 즉, 최종적으로 만들 두 수가 정해져 있는 경우 가장 마지막 연산부터 X>Y인지, Y>X인지 정해가면서 계산해오면 사용한 연산의 나열을 알 수 있고, 이는 수가 정해져있을 경우 유일합니다. (유클리드 알고리즘을 떠올려도 좋습니다) 이제, 모든 1 이상 N이하의 i에 대해서 (N, i)를 만드는 연산 횟수를 세고 (이는 mod연산을 이용해서 개수만 빠르게 세어줍니다), 이 중 연산 횟수가 최소인것을 모두 골라 사전순 최소인 것을 고르면 됩니다. 가능한 길이로는 O(logN) 상한이 있기 때문에, 위 방법으로 문제를 풀면 $O(N \..