Skip to content

Commit f887a82

Browse files
committed
LibreOJ: 2292
「THUSC 2016」成绩单
1 parent 45f167a commit f887a82

File tree

1 file changed

+67
-0
lines changed

1 file changed

+67
-0
lines changed

LibreOJ/2292.cpp

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/**
2+
* @file 2292.cpp
3+
* @author Macesuted ([email protected])
4+
* @date 2022-09-12
5+
*
6+
* @copyright Copyright (c) 2022
7+
*
8+
*/
9+
10+
#include <bits/stdc++.h>
11+
using namespace std;
12+
13+
#ifndef LOCAL
14+
#define endl '\n'
15+
#endif
16+
17+
bool mem1;
18+
19+
#define maxn 55
20+
21+
int a[maxn], v[maxn], f[maxn][maxn][maxn][maxn], g[maxn][maxn];
22+
23+
void solve(void) {
24+
int n, A, B;
25+
cin >> n >> A >> B;
26+
for (int i = 1; i <= n; i++) cin >> a[i], v[i] = a[i];
27+
sort(v + 1, v + n + 1);
28+
int vn = unique(v + 1, v + n + 1) - v - 1;
29+
for (int i = 1; i <= n; i++) a[i] = lower_bound(v + 1, v + vn + 1, a[i]) - v;
30+
memset(f, 0x3f, sizeof(f)), memset(g, 0x3f, sizeof(g));
31+
for (int i = 1; i <= n; i++) g[i][i] = A;
32+
for (int len = 2; len <= n; len++)
33+
for (int l = 1, r = len; r <= n; l++, r++)
34+
for (int vl = 1; vl <= vn; vl++)
35+
for (int vr = vl; vr <= vn; vr++) {
36+
int tl = l, tr = r;
37+
while (tl <= r && vl <= a[tl] && a[tl] <= vr) tl++;
38+
while (tr >= l && vl <= a[tr] && a[tr] <= vr) tr--;
39+
if (tl == r + 1)
40+
f[l][r][vl][vr] = 0;
41+
else {
42+
f[l][r][vl][vr] = g[tl][tr];
43+
for (int k = l; k < r; k++)
44+
f[l][r][vl][vr] = min(f[l][r][vl][vr], f[l][k][vl][vr] + f[k + 1][r][vl][vr]);
45+
}
46+
g[l][r] = min(g[l][r], f[l][r][vl][vr] + A + B * (v[vr] - v[vl]) * (v[vr] - v[vl]));
47+
}
48+
cout << g[1][n] << endl;
49+
return;
50+
}
51+
52+
bool mem2;
53+
54+
int main() {
55+
ios::sync_with_stdio(false), cin.tie(nullptr);
56+
#ifdef LOCAL
57+
cerr << "Memory Cost: " << abs(&mem1 - &mem2) / 1024. / 1024. << "MB" << endl;
58+
#endif
59+
60+
int _ = 1;
61+
while (_--) solve();
62+
63+
#ifdef LOCAL
64+
cerr << "Time Cost: " << clock() * 1000. / CLOCKS_PER_SEC << "MS" << endl;
65+
#endif
66+
return 0;
67+
}

0 commit comments

Comments
 (0)