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

题目描述

给定两个长度为 n 的序列 a,b,找出一个长为 n 的序列 c,满足对于 i=1,2,⋯,n,有 ci​=ai​ 或 ci​=bi​,使得 ∑i=2n​∣ci​−ci−1​∣ 最小,你只需要输出这个最小值。

输入格式

  • 输入的第一行包含一个正整数 n。
  • 接下来一行 n 个整数,表示序列 ai​。
  • 接下来一行 n 个整数,表示序列 bi​。

输出格式

输出一行一个整数,表示 ∑i=2n​∣ci​−ci−1​∣ 的最小值。

输入输出样例

输入 #1复制

5
1 3 4 2 5
2 5 4 2 1

输出 #1复制

5

数据范围

  • 对于 20% 的数据,满足 n≤20。
  • 对于 100% 的数据,满足 1≤n≤2×105,0≤∣ai​∣,∣bi​∣≤109。

附件下载

seq.zip50.62KB

总体就是按照题目要求,求出最小值

第一种20分的写法就是DFS纯暴力

满分写法用DP来写

就是继承之前以a[i - 1]和b[i - 1]结尾的最佳情况

相当于

a1[i] = min(a1[i - 1] + abs(a[i - 1] - a[i]),b1[i - 1] + abs(b[i - 1] - a[i]));

b1[i] = min(a1[i - 1] + abs(a[i - 1] - b[i]),b1[i - 1] + abs(b[i - 1] - b[i]));

仔细想想就知道了

代码也就很好写了

以下是代码

#include <bits/stdc++.h>
using namespace std;
int n;
long long a[200100] = {0},b[200100] = {0},a1[200100] = {0},b1[200100] = {0};
int main(){
	cin>>n;
	for(int i = 1;i <= n;i++){
		cin>>a[i];
	}
	for(int i = 1;i <= n;i++){
		cin>>b[i];
	}
	for(int i = 2;i <= n;i++){
		a1[i] = min(a1[i - 1] + abs(a[i - 1] - a[i]),b1[i - 1] + abs(b[i - 1] - a[i]));
		b1[i] = min(a1[i - 1] + abs(a[i - 1] - b[i]),b1[i - 1] + abs(b[i - 1] - b[i]));
	}
	cout<<min(a1[n],b1[n])<<endl;
	return 0;
}

点个赞吧求求了

想要粉丝

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值