codeforces에서 문제를 해결하고 있습니다.이 알고리즘의 정확성을 증명하는 방법은 무엇입니까?
우리의 임무는 주어진 정수 시퀀스를 감소하지 않는 시퀀스로 만들기위한 최소 비용을 찾는 것입니다. 각 단계에서 시퀀스의 수를 1 씩 증가/감소시킬 수 있으며 1 씩 증가합니다.
예를 들어 시퀀스 3, 2, -1, 2, 11이 주어지면 시퀀스를 만들 수 있습니다 선정 된 4 감소 아닌 수 (2
에 3
감소하고 2
에 -1
을 증가시켜, 따라서 비 감소 시퀀스 2, 2, 2, 2, 11이 될 것이다)이 문제의 editorial 따르면
우리 해결 이 문제는 2 시퀀스 (하나는 우리가 주어진 시퀀스이고 다른 하나는 주어진 시퀀스의 정렬 된 시퀀스)를 사용하여 동적 프로그래밍을 사용합니다.
용액의 개요 : 우리 a
원래 순서하고 b
시퀀스 a
의 정렬 순서, 그리고 f(i,j)
는 시퀀스를 획득하기 위해 요구되는 이동의 최소한의 수 있도록 해주면
되는 제의 i 요소는 감소하지 않고 i 번째 요소는 기껏해야 bj입니다. 그러면 다음과 같이 재발 할 수 있습니다. (이것은 문제의 사설에서 발췌 한 것입니다)
f(1,1)=|a1-b1|
f(1,j)=min{|a1-bj|,f(1,j-1)}, j>1
f(i,1)=|ai-b1|+f(i-1,1), i>1
f(i,j)=min{f(i,j-1),f(i-1,j)+|ai-bj|}, i>1, j>1
나는이 재발을 이해한다. 그러나 원래 시퀀스를 정렬 된 시퀀스와 비교해야하는 이유를 알 수 없으며 주어진 시퀀스의 정렬 된 시퀀스 이외의 다른 시퀀스를 사용하여 올바른 최소 비용을 얻을 수 있는지 여부를 확신 할 수 없습니다.
이 솔루션의 정확성을 어떻게 입증 할 수 있습니까? 그리고 정렬 된 순서로 답을 최저 비용으로 어떻게 보장 할 수 있습니까?