题解:B4163 [BCSP-X 2024 12 月初中组] 序列选择

· · 题解

题解:B4163 [BCSP-X 2024 12 月初中组] 序列选择

还是我的一个朋友 @Leo926 告诉了我这道题又水又可以写题解,我就快快过来发一篇。

1. 解题思路

一眼动态规划水题。直接来说定义:f_{i,j} 表示 c 序列中第 i 位为 a_i (j=0)b_i (j = 1) 时最小的答案。最终答案就是 \min\{f_{n,0}, f_{n,1}\}

现在我们来分析转移方程:

f_{i,0} = \min\{f_{i-1,0} + |a_i - a_{i-1}|, f_{i-1,1} + |a_i - b_{i-1}|\}\\f_{i,1} = \min\{f_{i-1,0} + |b_i - a_{i-1}|, f_{i-1,1} + |b_i - b_{i-1}|\}

最后来确定初始条件:f_{1,0} = f_{1,1} = 0

2. 代码实现

```cpp #include <bits/stdc++.h> using namespace std; #define int long long constexpr int maxn = 2e5 + 10; int n, a[maxn], b[maxn], f[maxn][2]; signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i <= n; i++) cin >> b[i]; f[1][0] = f[1][1] = 0; for (int i = 2; i <= n; i++) { f[i][0] = min(f[i - 1][0] + abs(a[i] - a[i - 1]), f[i - 1][1] + abs(a[i] - b[i - 1])); f[i][1] = min(f[i - 1][0] + abs(b[i] - a[i - 1]), f[i - 1][1] + abs(b[i] - b[i - 1])); } cout << min(f[n][0], f[n][1]) << "\n"; return 0; } ```