线性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;
} 
相关推荐
luj_17681 小时前
塔防牌:策略与卡牌的智慧碰撞
服务器·c语言·开发语言·经验分享·算法
郝学胜-神的一滴2 小时前
干货版《算法导论》17:二叉树核心原理、遍历逻辑与高阶实操全解
数据结构·c++·python·算法·计算机·编程
爱编程的小新☆2 小时前
【LeetCode】从递归到 Flood Fill:5 道题吃透 DFS 的选择、回溯与标记
java·算法·leetcode·深度优先·回溯·flood fill
Water_Sunzhipeng2 小时前
2024牛客暑期多校训练营1
算法
hetao17338372 小时前
2026-08-09~08-14 hetao1733837 的刷题记录
c++·算法
技术小黑2 小时前
RNN算法实战系列06 | LSTM 实现糖尿病探索与预测
rnn·算法·lstm
疯狂打码的少年2 小时前
【数据结构】二叉树的性质(五大性质+计算)
数据结构·笔记·算法
wabs6663 小时前
关于图论【A*算法 | 卡码网127.骑士的攻击的思考】
数据结构·算法·图论·卡码网·广搜的改进版
CIO_Alliance3 小时前
AI认知系列(3)| 数据、算法、算力、场景四要素协同
人工智能·算法·ipaas·系统集成·企业cio联盟·企业级ai化转型
..Dauntless..4 小时前
手写vector vs std::vector:从功能正确到性能达标
算法