B4163 [BCSP-X 2024 12 月初中组] 序列选择 题解
博客园可能食用更佳
给定长度为 \(n\) 的序列 \(a,b\),指定一个长度为 \(n\) 的序列 \(c\),钦定 \(\forall i \in [1,n] \cap \mathbb Z,c_i=a_i \lor c_i=b_i\),最小化 \(\sum_{i=2}^{n} |c_i-c_{i-1}|\)。
\(n \leq 2 \times 10^5,|a_i|,|b_i| \leq 10^9\)。
考虑 dp,记 \(dp_{i,0/1}\) 表示第 \(i\) 个数选 \(a_i/b_i\) 的最小代价,则:
\[\begin{aligned}
dp_{i,0} &=
\begin{cases}
0 &,i=1\\
\min \lbrace dp_{i-1,0}+|a_i-a_{i-1}|,dp_{i-1,1}+|a_i-b_{i-1}| \rbrace &,i \geq 2\\
\end{cases}\\
dp_{i,1} &=
\begin{cases}
0 &,i=1\\
\min \lbrace dp_{i-1,0}+|b_i-a_{i-1}|,dp_{i-1,1}+|b_i-b_{i-1}| \rbrace &,i \geq 2\\
\end{cases}\\
\end{aligned}
\]
答案即为 \(\min \lbrace dp_{n,0},dp_{n,1} \rbrace\)。
代码没什么细节,注意到 \(10^5 \times 10^9 = 10^{14} > 2^{31}-1\),故记得开 long long
。
时间复杂度 \(\mathcal O(n)\)。
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define min(a,b) (a<b?a:b)
using namespace std;
template <typename T>
il void read(T &x)
{
x=0;int f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
x*=f;
}
template <typename T>
il void write(T x)
{
if(x<0) putchar('-'),x=~x+1;
if(x>9) write(x/10);
putchar(x%10^48);
}
const int N=2e5+5;
int n,a[N],b[N];
ll f[N][2];
int main()
{
read(n);
for(int i=1;i<=n;i++) read(a[i]);
for(int i=1;i<=n;i++) read(b[i]);
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]));
}
write(min(f[n][0],f[n][1]));
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!