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;
}
posted @   lunjiahao  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示