题解:B4163 [BCSP-X 2024 12 月初中组] 序列选择
题目传送门
题目分析:
本题的目标是从两个长度为
解题思路:
我们可以使用动态规划的方法来解决这个问题。定义两个状态数组
·
·
状态转移方程如下:
·当
·当
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
int a[200005], b[200005], dp[200005][2];
signed main() {
int n;
cin >> n;
for (int i = 1; i <= n; i ++) cin >> a[i];
for (int i = 1; i <= n; i ++) cin >> b[i];
dp[2][0] = min(abs(a[2] - a[1]), abs(a[2] - b[1]));
dp[2][1] = min(abs(b[2] - a[1]), abs(b[2] - b[1]));
for (int i = 3; i <= n; i ++) {
dp[i][0] = min(dp[i - 1][0] + abs(a[i] - a[i - 1]), dp[i - 1][1] + abs(a[i] - b[i - 1]));
dp[i][1] = min(dp[i - 1][0] + abs(b[i] - a[i - 1]), dp[i - 1][1] + abs(b[i] - b[i - 1]));
}
cout << min(dp[n][0], dp[n][1]) << endl;
return 0;
}
复杂度分析:
·时间复杂度:代码中主要的操作是一个循环,循环次数为
·空间复杂度:使用了两个长度为
注意事项:
·输入的序列长度为
·代码中使用了
谢谢大家观看我的题解