线性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;
} 
相关推荐
Dream it possible!8 小时前
LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)
算法·leetcode·面试·动态规划
心抵鹊9 小时前
算法之双指针系列(一)
算法·leetcode
十二9 小时前
【洛谷题解】P1083 [NOIP 2012 提高组] 借教室(二分答案 + 差分)
数据结构·c++·算法·蓝桥杯
小此方10 小时前
[算法实战论:动态规划]回文串问题的dp解法,回文串问题的母题,以及以此为基础的派生题
算法·动态规划
Pniubi11 小时前
力扣560.和为k的子数组
算法·leetcode·职场和发展
D e re k ZH11 小时前
C++ 从零入门(一):基础语法与程序结构
数据结构·c++·算法
Pniubi12 小时前
力扣438.找到字符串中所有字母异位词
算法·leetcode·职场和发展
東隅已逝,桑榆非晚14 小时前
算法6. 双指针法-查找总价格为目标的两个商品
c++·学习·算法
Eyfcom14 小时前
〖物联网终端实战 01〗UWB 室内高精度定位:仓储 AGV 与人员的厘米级轨迹追踪
物联网·算法·物流系统·快递系统·跨境物流快递系统·物联网终端实战
bro_Java66615 小时前
《排序的底层逻辑:比较、交换与分治》
java·算法·排序算法