线性dp-综合刷题1(Not Alone)

题目链接

环形数组优美可以有两种方式:一种是前面i-2个数可以组成优美的环形数组,让第i个和第i-2个数变相同;还有一种是前面i-3个数可以组成优美的环形数组,让第i-2个、第i-1个和第i个数变相同。

那要变相同的数怎么加减次数最少呢?往他们中位数的方向去变。记录最大值maxx和最小值minn,最少的加减次数为maxx-minn。

AC代码:

cpp 复制代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=400005;
int t,n,dp[maxn],a[maxn],ans;
signed main(){
	cin>>t;
	while(t--){
		cin>>n;
		ans=1e18;
		for(int i=1;i<=n;i++) {
	 		cin>>a[i];
			a[i+n]=a[i];	
		}
		for(int i=0;i<3;i++){
			for(int j=1;j<=n*2;j++) dp[j]=1e18;
			dp[i]=0;
			for(int j=i+1;j<=i+n;j++){
				if(j>=2) dp[j]=min(dp[j],dp[j-2]+abs(a[j]-a[j-1]));
				if(j>=3){
					int maxx=0,minn=1e18;
					for(int k=j-2;k<=j;k++){
						maxx=max(maxx,a[k]);
						minn=min(minn,a[k]);
					}
					dp[j]=min(dp[j],dp[j-3]+maxx-minn);
				}
			}
			ans=min(ans,dp[n+i]);
		}
		cout<<ans<<endl;
	}
	return 0;
} 
相关推荐
weixin_307779136 分钟前
一维无粘 Burgers 方程的激波形成问题:MacCormack 格式求解
c++·算法·matlab
HugoStudio_SWAN29 分钟前
洛谷 B4500 / B4449 / B3843 凯撒密码、密码强度与密码合规——加密与安全的三道门
c++·学习·程序人生·算法·安全
枫叶林FYL1 小时前
【群体智能集群控制工程实践】第3章 一致性协同算法
算法
禹凕2 小时前
滑动窗口算法实战指南
python·算法
DisonTangor2 小时前
【腾讯混元雪耻归来】 Hy4 preview:770B 参数 MoE 旗舰模型,1M 上下文全面开源
人工智能·算法·开源·aigc·腾讯云·腾讯云ai代码助手
明月_清风3 小时前
从二叉树到 B+ 树:一文搞懂工程中「树」的演化之道
数据结构·算法·go
渡我白衣3 小时前
并查集:基础认识与模拟实现
android·java·javascript·数据结构·c++·算法·并查集
hetao17338373 小时前
2026-09-01~09-04 hetao1733837 的刷题记录
c++·算法
Evand J4 小时前
【MATLAB例程,图像滤波5】 反谐波均值滑动窗口滤波(CHMF)图像降噪与质量评价,附代码下载链接
图像处理·算法·计算机视觉·matlab·均值算法·滑动窗口滤波·均值滑动
血小板要健康4 小时前
链表 阶段算法总结
java·数据结构·笔记·算法·leetcode·链表