일류 1D/1D 동적 기획 방정식의 세 가지 최적화 상황 단조로운 대기열 최적화 경사율 최적화 결정 단조로운 최적화

13721 단어
모두가 알다시피 DP 최적화는 단조로운 대기열 최적화, 데이터 구조 최적화, 행렬 신속 멱 최적화, 사율 최적화, 사각형 부등식 최적화, 결정 단조성 최적화, 볼록 최적화 등이 있다.본고는 DP 방정식의 세 가지 최적화 상황을 설명한다.

f [ i ] = min ⁡ { f [ j ] + w ( i , j ) } f[i]=\min\{f[j]+w(i,j)\} f[i]=min{f[j]+w(i,j)}


그 중에서 j∈[l[i], r[i]j\in[l[i], r[i]j∈[l[i], r[i]]]와 l[i]l[i]l[i], r[i]r[i]r[i]r[i]는 단조롭다.min\min\minmax\max\max로 바꿀 수 있습니다. 방법은 같습니다.

w(i,j)w(i,j)w(i,j)는 jj와 무관하다


j, k∈[l[i], r[i](j시간 복잡도

w(i, j) w(i, j) w(i, j)는 ii의 다항식, jjj항과 ijij항만 포함한다.


만나다
시간의 복잡도는 O(n) O(n) O(n) 또는 O(n log ⁡ n) O(n\log n) O(nlogn)이다.

w(i,j)w(i,j)w(i,j) 충족 사각형 부등식


사각형 부등식 w(i+1,j)-3-w(i,j)≥w(i+1,j+1)-3-w(i,j+1)w(i+1,j)-w(i,j)\gew(i+1,j+1)-w(i,j+1)w(i,j+1)w(i+1,j)-3. w(i,j)≥w(i+1,j)-3.따라서 k>jk>jk>j에 대해 kk에서 jj로 이전하는 것이 jj에서 이전하는 것보다 못하지 않으면 jjj가 kk에서 이전한 후에 쓸모가 없다. 왜냐하면 ii가 증가함에 따라 w(i,j)w(i,j)w(i,j)는 w(i,k)w(i,k)w(i,k)w(i,k)보다 점점 나빠지기 때문이다.즉 f[i] f[i] f[i]의 결정점은 단조롭고 오른쪽으로 이동하는 것이다. 즉, 결정의 단조성이다.
일반적으로 두 가지 방법으로 실현할 수 있다.

창고+2점


모든 결정 지점이 어떤 상태를 갱신할 수 있는지 고려하다.우리는 111에서 nn의 결정 지점을 일일이 열거하여 뒤의 상태를 갱신한다.의사결정의 단조성 때문에 매번 갱신된 후에 의사결정 점수열은 단조롭고 줄어들지 않는다.따라서 매번 업데이트되는 위치는 [ki, n] [k i, n] [ki, n] 구간입니다.그래서 우리는 하나의 창고로 왼쪽에서 오른쪽으로 연속적으로 같은 의사결정 블록을 유지하고 매번 업데이트할 때 창고 꼭대기에서 검사를 시작한다. 만약에 새로운 의사결정 블록이 원래의 의사결정 블록보다 완전히 우수하면 원래의 의사결정 블록을 떨어뜨린다. 그렇지 않으면 2분의 1의 의사결정 블록 구간에서 어느 점부터 새로운 의사결정이 더 좋은지 찾아낸다.마지막으로 새로운 결정 블록을 창고에 넣습니다.
각 의사 결정은 2분 소요로 인해 최대 한 번 입고, 출고됩니다. 시간 복잡도는 O(n log n) O(n\log n) O(nlogn) O(nlogn)입니다.
struct decis {
	int a, l, r; //      ,       
}S[maxn];
int top;

//...
{
	top = 0;
	S[top++] = (decis){0, 0, n-1}; //       
	for(int i = 1; i < n; i++) {
		while(top) {
			decis ctop = S[top-1];
			int ftop = f[ctop.a] + calc(), fnew = f[i] + calc(); //calc()    ctop.a i  ctop.l   
			if(ftop > fnew) top--; else break;
		}
		if(top) {
			int l = S[top-1].l, r = S[top-1].r+1;
			while(l < r) {
				int mid = l + r >> 1;
				int ftop = f[S[top-1].a] + calc(), fnew = f[i] + calc();  //calc()    S[top-1].a i  mid   
				if(ftop > fnew) r = mid; else l = mid+1;
			}
			//   l             
			if(l <= S[top-1].r) {
				decis o = S[top-1]; top--;
				S[top++] = (decis){o.a, o.l, l-1};
			}
			if(l <= n-1) S[top++] = (decis){i, l, n-1};
		}else S[top++] = (decis){i, k-1, n-1};
	}
	for(int i = 0; i < top; i++) for(int j = S[i].l; j <= S[i].r; j++) f[j] = f[S[i].a] + calc();
}


분치하다


분치 처리 각 점의 결정점을 고려하다.현재 처리 [l,r][l,r][l,r]의 결정점을 설정하고 가능한 결정점 구간을 [L,R][L,R][L,R][L,R]로 알고 있습니다.m i d = l + r 2 mid=\rac {l+r} {2} {2}mid=2l+r를 설정하면 먼저 폭력적으로 m i d mid의 결정 포인트 pp(범위는 [L, m i d] [L, mid] [L,mid] [L,mid] [L,mid] [L,mid] [L,mid] [L,mid] [L,mid] [L,mid] [L,mid] [L,mid] [L,mid] [L,mid]]]]])를 구하고 양쪽으로 나누어 처리한 다음에 [l, 분명히 [l, m i d] [l, m i d] [l,mid] [l, [l,mid] [l, [l, [l, [l, r] [l, R] [p, R] [p, R].복잡도는 O(n log ⁡ n) O(n\log n) O(nlogn)입니다.

w(i,j)w(i,j)w(i,j)는 사각형의 부등식과 구간의 단조성을 만족시킨다


Upd on 2018.11.26
구간 단조성은 모든 구간에 대해 [i, j] [i, j] [i′, j′] [i', j'] [i′, j′], w(i, j)> w(i′, j′) w(i, j′) w(i, j)>w(i', j') w(i, j') >w(i, j') >w(i′, j′)가 있다.
만약에 w(i, j)w(i, j)w(i, j)가 사각형의 부등식과 구간의 단조성을 만족시킨다면 결정점은 구간의 단조성을 만족시킨다.따라서 매거결정 지점을 열거할 때는 이전의 결정 지점 간에만 매거한다.사각형 부등식 최적화 구간 DP와 유사하며 복잡도는 O(n3)O(n^3)O(n3)에서 O(n2)O(n^2)O(n^2)O(n2)로 낮아진다.
예제: IOI2000 우체국

연습 문제


BZOJ3675 POJ1160 BZOJ1492 HDU3480 BZOJ2726 HDU2829 BZOJ1791 HDU3516
2018.11.30 DP 돌출 최적화

좋은 웹페이지 즐겨찾기