luoguP2466 [SDOI2008] 슈의 작은 공
처음에 나는 3차원 (dp\), 즉 2차원 좌표, 1차원 시간에 대해 생각했다.
아쉽게도 공간이 터졌다.
그러나 시간은 선형이기 때문에 우리는 반대로 설정할 수 있다.
즉설\(dp[0/1][st][ed]\)는 좌표에 따라 정렬된 제\(st\)개의 알을 제\(ed\)개의 알로 처리한 후 남은 알에 미치는 영향을 나타낸다.
답은\(\sum^{n} {i=1}y[i]-\min(dp[0][1][n], dp[1][1][n])\이다.
전환이 일반 구간\(dp\) 소켓이 됩니다.\[\begin{align} dp[0][st][ed]=&min(dp[0][st][ed],min(\\&dp[0][st+1][ed]+(sum[n]+sum[st]-sum[ed])*(a[st + 1].x - a[st].x),\\&dp[1][st + 1][ed] + (sum[n] + sum[st] - sum[ed]) * (a[ed].x - a[st].x)));\\dp[1][st][ed]=&min(dp[1][st][ed],min(\\&dp[1][st][ed - 1] + (sum[n] + sum[st - 1] - sum[ed - 1]) * (a[ed].x - a[ed - 1].x),\\&dp[0][st][ed - 1] + (sum[n] + sum[st - 1] - sum[ed - 1]) * (a[ed].x - a[st].x)));\end{align}\]
#pragma GCC optimize(3)
#include
#define il inline
#define rg register
#define gi read
using namespace std;
const int O = 1010;
template
il TT read() {
TT o = 0,fl = 1; char ch = getchar();
while (!isdigit(ch) && ch != '-') ch = getchar();
if (ch == '-') fl = -1, ch = getchar();
while (isdigit(ch)) o = o * 10 + ch - '0', ch = getchar();
return fl * o;
}
struct Data {
int x, y, v;
il bool operator < (Data rhs) const {
return x < rhs.x;
}
}a[O];
int n, St, sum[O], dp[2][O][O], Sum;
int main() {
memset(dp, 63, sizeof dp);
n = gi() + 1, a[1].x = St = gi();
for (int i = 2; i <= n; ++i) a[i].x = gi();
for (int i = 2; i <= n; ++i) a[i].y = gi(), Sum += a[i].y;
for (int i = 2; i <= n; ++i) a[i].v = gi();
sort(a + 1, a + n + 1);
for (int i = 1; i <= n; ++i) sum[i] = sum[i - 1] + a[i].v;
for (int i = 1; i <= n; ++i)
if (!a[i].v && a[i].x == St) {
dp[0][i][i] = dp[1][i][i] = 0;
break;
}
for (int len = 1; len < n; ++len)
for (int st = 1; st + len <= n; ++st) {
int ed = st + len;
dp[0][st][ed] = min(dp[0][st][ed], min(dp[0][st + 1][ed] + (sum[n] + sum[st] - sum[ed]) * (a[st + 1].x - a[st].x), dp[1][st + 1][ed] + (sum[n] + sum[st] - sum[ed]) * (a[ed].x - a[st].x)));
dp[1][st][ed] = min(dp[1][st][ed], min(dp[1][st][ed - 1] + (sum[n] + sum[st - 1] - sum[ed - 1]) * (a[ed].x - a[ed - 1].x), dp[0][st][ed - 1] + (sum[n] + sum[st - 1] - sum[ed - 1]) * (a[ed].x - a[st].x)));
}
printf("%.3lf
", (Sum - min(dp[1][1][n], dp[0][1][n])) / 1000.);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.