Estimation[优先队列+DP]

传送门

首先f[i][j] 表示1--i 区间分成j段的最小花费,w[i][j]表示区间i--j的花费

f[i][j]=min(f[i][j],f[x][j-1]+w[x+1][i])

现在是如何快速求w[i][j]的问题

首先知道B因取中位数

其次发现w[i][j] = val[后半部分] - val[前半部分]

用两个优先队列动态维护前一半和后一半就好了

复杂度O(n^2*log(n) + n^2*k)


#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define N 2005
#define K 30
using namespace std;
int f[N][K],n,k,a[N],w[N][N];
int main(){
	while(scanf("%d%d",&n,&k) && (n+k)!=0){	
		for(int i=1;i<=n;i++){
			scanf("%d",&a[i]);
		}
		for(int i=1;i<=n;i++){
			priority_queue<int> pre;
           	priority_queue<int,vector<int>,greater<int> > suf;
           	int now=0;
			for(int j=i;j<=n;j++){
           		if(suf.empty()||a[j]>=suf.top()) suf.push(a[j]),now+=a[j];
           		else pre.push(a[j]),now-=a[j];
           		int x1=(j-i+1)>>1,x2=j-i+1-x1;
           		if(pre.size()>x1) suf.push(pre.top()),now+=pre.top()*2,pre.pop();
           		if(suf.size()>x2) pre.push(suf.top()),now-=suf.top()*2,suf.pop();
           		if(x1==x2) w[i][j]=now;
           		else w[i][j]=now-suf.top();
			}
		}
		memset(f,127,sizeof(f));
		for(int i=1;i<=n;i++) f[i][1]=w[1][i];
		for(int i=1;i<=n;i++)
			for(int j=2;j<=k;j++)
				for(int x=1;x<i;x++)
					f[i][j]=min(f[i][j],f[x][j-1]+w[x+1][i]);
		printf("%d\n",f[n][k]);
	}return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
引用\[1\]: "Classification, parameter estimation, and state estimation: an engineering approach using MATLAB" 是一本关于使用MATLAB进行分类、参数估计和状态估计的工程方法的书籍标题。引用\[3\]: "Classification, Parameter Estimation and State Estimation" 是一本实用指南,适用于数据分析师、测量系统设计师和对使用MATLAB进行高级测量系统感兴趣的研究生学生。该书介绍了一个名为"Prtools"的强大MATLAB工具箱,用于模式识别,该工具箱由合著者之一、代尔夫特理工大学的B. Duin编写和拥有。 问题: Parameter Estimation Toolbox是什么? 回答: "Parameter Estimation Toolbox" 是一个MATLAB工具箱,用于参数估计。它提供了一套工具和函数,用于处理参数估计问题,包括设置参数初值、确定参数范围、进行参数估计和验证模型精度。这个工具箱可以帮助数据分析师和测量系统设计师进行参数估计和模型验证的工作。 #### 引用[.reference_title] - *1* *3* [分类、参数估计和状态估计:基于MATLAB的工程方法-Classification, parameter estimation, and state ...](https://blog.csdn.net/weixin_42392054/article/details/115924568)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [电池SOC仿真系列-基于Parameter Estimation Toolbox的电池参数辨识](https://blog.csdn.net/c85759351/article/details/112822098)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FSYo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值