qqs2점 중 2점 조건 세부적 사고
전이 방정식은 dp [i] [j] = m a x {d p [x] [j-3] + w(x+1,i)} dp[i] [j] = max\{dp[x] [j-1] + w(x+1,i)\dp[i] [j]=max{dp[x] [j-3] + w(x+1,i)}, dp [n] dp[n][k]dp[n][k]]를 요구한다.2D1D 동적 계획 시간의 복잡도는 O(n3)O(n^3)O(n3)로 최적화가 필요하다.f[k]=dp[n][k]f[k]=dp[n][k]=dp[k]=dp[n][k], fff는 볼록함수로 (k, f[k])(k, f[k])(k, f[k])와 서로 접하는 직선을 구성하면 f[k]f[k] f[k]f[k]]를 구할 수 있다. 이 직선의 경사율을 2분하면 복잡도를 O(logn)O(logn} {logn})로 낮출 수 있다.이 문제와 결합하여 더욱 형상적으로 말하면 k가 클수록 최대치가 커지기 어려워지고 튀어나온다.우리는 두 가지 대가로 v a l val val을 나눈다. 매번 정답을 나누면 d p [i] = m a x {d p [x] + w (x + 1,i) - v a l} dp[i] = max\{dp[x] + w (x + 1,i) - val\} dp[i] = max {dp [x] + w (x + 1,i) - val\= max {dp [x] + w (x + 1,i) - val} 를 빼면 최대치를 나누면 할수록 성장하기 어렵다는 뜻이다.v a l val val이 너무 크면 f f f가 k k k가 비교적 작은 곳에서 가장 큰 값을 얻는다.반대로 해도 마찬가지다.적절한 v a l val val의 경우 제목에 지정된 kk의 값을 입력하여 가장 높은 값을 얻을 수 있습니다. 이때'절선'을 찾을 수 있습니다.
struct DP { int f, k; } dp[N];
bool operator < (DP a, DP b) {
if (a.f != b.f) return a.f < b.f;
return a.k < b.k;
}
inline DP solve (int val) {
for (int i = 1; i <= n; i++) {
for (int j = 0; j < i; j++) {
dp[i] = max(dp[i], { dp[j].f + w(j + 1, i) - val, dp[j].k + 1 });
}
}
return dp[n];
}
int wqs (void) {
int st, en, md;
while (st != en) {
int md = (st + en + 1) >> 1;
if (solve(md).k > k) st = md;
else en = md - 1;
}
return solve(st).f;
}
주의해야 할 것은 함수가 엄격하게 튀어나오지 않을 수도 있고, 절선이 여러 점을 동시에 통과할 수도 있다는 것이다.이 예제에서 설명하자면 어떤 v a l val val에 대해 여러 개의 kk가 dp[n]dp[n]dp[n]를 최대치로 하고 2분 동안 우리는 문제를 kk로 배제할 수 없도록 주의해야 한다.다시 불러오는 것이 기호보다 작다는 것을 보면 우리가 최종적으로 되돌아온 dp[n]를 알 수 있다.k dp[n].k dp[n].k는 조건을 만족시키는 가장 큰 kk라는 점을 고려해야 한다.그럼 재부팅할 때 거꾸로 쓰면?다음과 같습니다.
bool operator < (DP a, DP b) {
if (a.f != b.f) return a.f < b.f;
return a.k > b.k;
}
int wqs (void) {
...
int md = (st + en) >> 1;
if (solve(md).k > k) st = md + 1;
else en = md;
...
}
어쨌든 디버그를 할 때는 이 점을 생각해야 한다. 하지만 내가 이런 문제를 칠 차례는 아니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.