题解:P13233 [GCJ 2015 Finals] Costly Binary Search
Priestess_SLG · · 题解
简单题。先考虑一个朴素的多项式时间复杂度做法。记
考虑进一步优化。注意到
转移考虑从小到大枚举所有花费
但是这样转移也有一个问题:空间开不下。注意到
inline void sol() {
scanf("%s", s + 1);
int n = strlen(s + 1);
for (int i = 0; i < 10; ++i) for (int j = 0; j <= n + 1; ++j) f[i][j] = j + 1, g[i][j] = j - 1;
for (int i = 1; i <= n; ++i) f[s[i] - '0'][i] = g[s[i] - '0'][i] = i;
for (int i = 0; ; ++i) {
if (g[i % 10][1] == n) { std::cout << i << '\n'; return; }
if (i) for (int j = 1; j <= n; ++j) f[i % 10][j] = std::min(f[i % 10][j], f[(i + 9) % 10][j]), g[i % 10][j] = std::max(g[i % 10][j], g[(i + 9) % 10][j]);
for (int j = n - 1; j; --j) f[i % 10][j] = std::min(f[i % 10][j], f[i % 10][j + 1]);
for (int j = 1; j < n; ++j) g[i % 10][j] = std::max(g[i % 10][j], g[i % 10][j - 1]);
for (int j = 1; j <= n; ++j) {
int l = f[i % 10][j - 1], r = g[i % 10][j + 1];
chkmin(f[(i % 10 + s[j] - '0') % 10][r], l), chkmax(g[(i % 10 + s[j] - '0') % 10][l], r);
}
}
}