각 위치 에 대해
라고 하자. 여기서 문자를 정수로 보아 0은 , 1은 로 생각한다. 그러면 는 중 하나이다.
먼저 목적식을 로 바꾸자. 의 앞 글자에 포함된 1의 개수를 라고 하면,
이다. 따라서
이다. 그러므로 전체 목적식은
이다.
이제 연산이 에 어떤 영향을 주는지 보자. 구간 에서 와 의 1 개수가 같다는 것은
이라는 뜻이다. 이 구간을 서로 바꾸면, 해당 구간의 모든 는 부호가 바뀐다. 즉 가 이면 이 되고, 이면 이 되며, 은 그대로 이다.
따라서 문제는 다음과 같이 바뀐다.
인 수열이 있다. 합이 인 연속구간의 부호를 원하는 만큼 뒤집을 수 있다. 이때
인 위치는 어떤 연산을 해도 계속 이다. 이제 인 위치들만 보자. 만약 어떤 두 비영 위치 사이에 이 먼저 나오고, 그 뒤에 이 나오며 그 사이가 모두 이라면, 그 전체 구간의 합은 이다. 이 구간을 뒤집으면
를 최대화하여라.
이
이 된다. 즉 비영 위치들만 보면 인접한 을 로 바꿀 수 있다.
이 연산을 반복하면, 인 위치들에서 모든 을 앞쪽으로, 모든 을 뒤쪽으로 보낼 수 있다. 또한 연산은 의 개수와 의 개수를 바꾸지 않으므로, 이보다 더 앞쪽에 을 많이 놓을 수는 없다.
가중치 은 가 작을수록 크다. 따라서 최적 상태는 다음과 같다.
따라서 구현은 간단하다. 인 위치들을 배열에 저장하고, 인 개수를 라고 하자. 비영 위치 배열을 라고 하면 최댓값은
이다. 여기서 구현에서는 를 -indexed 위치로 저장했기 때문에 가중치가 가 된다.
시간 복잡도는 이고, 메모리 복잡도는 이다.