(알고스팟) Quantization
<문제> https://algospot.com/judge/problem/read/QUANTIZE <key 포인트> N개의 숫자를 S개의 묶음으로 묶어서 해결 할 것. 만약 첫 묶음의 크기를 x라고 한다면 이제 나머지 묶음의 크기는 n-x개의 숫자를 S-1개로 묶는다. 이때 나머지 S-1개의 묶음의 합이 최소 값이어 야한다. 구간의 오차제곱의 최소합 구하기( 한개의 숫자로 표현했을시) 예를들어 1,4,6을 4로 표현 b ∑(A[i]-m)^2=(b-a+1)^2*m^2 -2*( ∑A[i])*m+ ∑(A[i])^2 a 이를 미분해서 정리하면 결국 m=( ∑A[i])/(b-a+1)로 평균이 된다. 이를 일일히 구하면 O(n)시간이 들지만 O(1)에 계산 할 수도 있다. 바로 A의 부분합을 계산하면 된다. pSum[k]=i는 0부터 k 까지의 A[i]의 합이라 할때 pSum[b]-pSum[a-1]=i가 0부터 b까지인 A[i]의 합 - i가 0부터 a-1까지인 A[i]의 합으로 나타 낼 수 있다. 오차제곱도 일일히 계산하면 오래걸린다. 오차제곱의 합= i가 a부터 b까지 일때 (A[i]-m)^2을 더한 값으로 이는 상수인 A[i]^2의 합- 2*m*(A[i]의 합)+m^2(b-a+1)이다. 이때, 첫 인자와 두번째는 m과 관련없는 부분합으로 미리 계산해 둔다. public class Quantization { private static int N; //사이즈 private static int p; private static int A[]; private static int pSum[]; private static int pSqSum[]; private static int cache[][]; private static final int INF=9999; public static void main(String[] a...