就是朴素的 dp 做法,但第 5 个测试点过不了,这题还不能下载数据。跟题解里的代码对拍过,也没有发现问题。
代码如下:
#include <iostream>
using namespace std;
void update(int l, int r, int from, int base, int& dpl, int& dpr) {
if (from <= l) {
dpl = min(dpl, r + r - l - from + base);
dpr = min(dpr, r - from + base);
} else if (from >= r) {
dpl = min(dpl, from - l + base);
dpr = min(dpr, from + r - l - l + base);
} else {
dpl = min(dpl, r + r - l - from + base);
dpr = min(dpr, from + r - l - l + base);
}
}
int main() {
int n;
cin >> n;
int l[n + 1], r[n + 1], dpl[n + 1], dpr[n + 1];
l[0] = 1; r[0] = 1; dpl[0] = 0; dpr[0] = 0;
const int MAXINT = 214748367;
for (int i = 1; i <= n; i++) {
cin >> l[i] >> r[i];
dpl[i] = MAXINT; dpr[i] = MAXINT;
}
for (int i = 1; i <= n; i++) {
update(l[i], r[i], l[i - 1], dpl[i - 1], dpl[i], dpr[i]);
update(l[i], r[i], r[i - 1], dpr[i - 1], dpl[i], dpr[i]);
}
cout << (min(dpl[n] + n - l[n], dpr[n] + n - r[n]) + n - 1);
}