P3446 [POI2006]EST-Aesthetic Text
*P3446 [POI2006]EST-Aesthetic Text
POI 合集。
还算有趣的动态规划。遇到这种区间划分题首先考虑 DP,设
不过我们注意到有很多
此时时间复杂度优化为
又因为固定
const int N = 2e3 + 5;
int n, m, ans = 2e9, L[N], pos[N], tot[N], f[N][N];
int len[N][N], pre[N][N], suf[N][N];
int main(){
cin >> m >> n;
for(int i = 1; i <= n; i++) {
cin >> L[i], L[i] += L[i - 1];
for(int j = i - 1; ~j; j--) {
int cur = i - j - 1 + L[i] - L[j];
if(cur > m) break; tot[i]++;
if(!j) f[i][tot[i]] = 0;
else {
f[i][tot[i]] = 2e9;
while(pos[j] < tot[j] && len[j][pos[j] + 1] <= cur) pos[j]++;
if(pos[j]) cmin(f[i][tot[i]], pre[j][pos[j]] + cur);
if(pos[j] < tot[j]) cmin(f[i][tot[i]], suf[j][pos[j] + 1] - cur);
} len[i][tot[i]] = cur;
} pre[i][0] = suf[i][tot[i] + 1] = 2e9;
for(int j = 1; j <= tot[i]; j++) pre[i][j] = min(pre[i][j - 1], f[i][j] - len[i][j]);
for(int j = tot[i]; j; j--) suf[i][j] = min(suf[i][j + 1], f[i][j] + len[i][j]);
if(i == n) for(int j = 1; j <= tot[n]; j++) cmin(ans, f[i][j]);
} cout << ans << endl;
return 0;
}