一道线性dp
思考出状态表示是关键
#include <bits/stdc++.h>
#define fi first
#define se second
#define endl '\n'
using namespace std;
using LL = long long;
const int N = 2e4 + 9;
int n;
LL f[N][2];//f[][0] 走完当前行且到达左端点 f[][1]走完当前行且到达右端点
int L[N],R[N];
void solve()
{
cin >> n;
memset(f,0x3f,sizeof f);
for (int i = 1;i <= n;i ++) cin >> L[i] >> R[i];
f[1][0] = R[1] - 1 + R[1] - L[1];
f[1][1] = R[1] - 1;
for (int i = 2;i <= n;i ++)
{
f[i][0] = min(f[i-1][0] + abs(L[i-1] - R[i]) + R[i] - L[i] + 1, f[i-1][1] + abs(R[i-1] - R[i]) + R[i] - L[i] + 1);
f[i][1] = min(f[i-1][0] + abs(L[i-1] - L[i]) + R[i] - L[i] + 1, f[i-1][1] + abs(R[i-1] - L[i]) + R[i] - L[i] + 1);
}
cout << min(f[n][1] + n - R[n],f[n][0] + n - L[n]) << endl;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int _ = 1;
// cin >> _;
while(_--) solve();
return 0;
}