P3842 线段
题目描述
在一个
你从
更具体一些说,你在任何时候只能选择向下走一步(行数增加
输入格式
第一行有一个整数
以下
输出格式
仅包含一个整数,你选择的最短路程的长度。
Solution
线性 DP
- 当走完当前行且停到左端点,那么一定是从右端点过来的
从上一行左端点转移的话就是
从上一行右端点转移的话就是

- 当走完当前行且停到右端点,那么一定是从左端点过来的
从上一行左端点转移的话就是
从上一行右端点转移的话就是

注意:到了最后一行走完线段时,还需要达到终点
int f[20010][2];
void solve() {
int n;cin >> n;vector<int> l(n + 1), r(n + 1);
for (int i = 1;i <= n;i++)cin >> l[i] >> r[i];
f[1][0] = r[1] + r[1] - l[1] - 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]),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]),f[i - 1][1] + abs(r[i - 1] - l[i])) + r[i] - l[i] + 1;
}
cout << min(f[n][0] + n - l[n], f[n][1] + n - r[n]);
}