일류 1D/1D 동적 기획 방정식의 세 가지 최적화 상황 단조로운 대기열 최적화 경사율 최적화 결정 단조로운 최적화
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 돌출 최적화
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
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 돌출 최적화
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.