斜率优化 hdu3480 pku3709 pku1180 pku2180

合金理论自动化工具包(Alloy-Theoretic Automated Toolkit:ATAT)的安装 合金理论自动化工具包(ATAT)是一个通用名称,指的是合金理论工具的集合,它包含了不同的代码工具,具体如下: 1)根据第一性原理(映射和映射)构造集群扩展的代码。簇展开是一种非常紧凑和有效的表达式,给出取代合金的能量作为其构型的函数(即原子的类型位于晶格的哪个位置)。 2)为了计算合金的热力学性质,从聚类展开开始,对晶格模型进行蒙特卡洛模拟(emc2和memc2)的代码。 3)执行晶格动力学计算的代码(fitfc, fitsvsl, svsl) 4)使用简单的物理或半经验模型计算电子和磁自由能贡献 阅读详情

      斜率优化是DP优化的一种,假设状态转移方程为dp[i]=min or max (dp[k]+w[i,k]),我们假设取其中两个解k1,k2(不妨设k1<k2),然后得到dp[k1]+w[i,k1]-(dp[k2]+w[i,k2])这个表达式,不妨设结果想取最小值的话,那么上面那个表达式<0就说明k1比k2优。接着经过将左边的一些对i有关的量移到小于号右边,然后就会发现右边的式子在k1<k2时对i具有单调性(如果单调递增的话,i就从1求到n,如果递减,i就从n求到1,状态转移方程变一下)。若此时k2比k1优,那么当求后面的i时,k2一定会比k1优的(因为有单调性)。所以如果我们求dp[i]时的最佳值为kk,那么取下一个i的最优值时,kk前删除的就不用考虑了。

      但是对i的单调性是建立在k1<k2的基础上的,所以如果问题比较极端的话,每次都是最小的最佳,那么将一点改善都没有,所以我们还要寻求别的改善方法。对上面移项后的式子,把右边除i后的项全部除到左边(此时注意符号的变化)。把此时左边的所有项记为G(k1,k2),如果k1<k2且G(k1,k2)<f[i](这是假设上面符号没变,符号变了后可以自己推下)时,k1比k2优.如果存在k1<k2<k3,使得G(k1,k2)<=G(k2,k3)时,k2永远不会是最佳的。因为当G(k1,k2)<=f[ii]时,k1会比k2,当G(k1,k2)>f[ii]时,G(k2,k3)也会>f[ii],此时k3会比k2优.所以此时可以把k2去掉,去掉后G(k1,k2)会保持单调递减,所以把此时的f[ii]插入到G(k1,k2)中,前面的G(k1,k2)都会>=f[ii],此时k2会比k1优,后面的都是k1比k2优,所以插入点的那个位置就可以知道最优的kk.具体的实现用两端都能出的队列即可完成。因为每个点进一次出一次队列,所以时间复杂度为O(n)。下面以hdu3480详细解释一下过程.

      hdu3480求将一个大集合分为m个小集合,使每个集合最大元素减最小元素平方和最小.也可用四边形不等式。排序后,状态转移方程为dp[i][j]=min(dp[k][j-1]+(a[i]-a[k+1])^2),然后k1<k2并且满足dp[k2][j-1]-dp[k1][j-1]+a[k2+1]*a[k2+1]-a[k1+1]*a[k1+1]<2*a[i]*(a[k2+1]-a[k1+1])时,k2会比k1优,所以把k1去掉。把右边的2*(a[k2+1]-a[k1+1])除到左边去(此时注意除的数的正负),然后把整体定义为一个函数G(k1,k2),如果G(k1,k2)<a[i]时,k2会比k1优。如果现在存在k1<k2<k3&&G(k2,k3)<G(k1,k2)时,那么k2是多余的,它永远也不会取到最优值(分别对G(k2,k3)<?a[i]讨论)。所以直接把k2去掉.

#include<iostream>
#include<algorithm>
using namespace std;

int dp[10010][5010],a[10010],q[10010];
int main()
{
	int n,m,i,j,k1,k2,k3,x1,y1,x2,y2,x3,y3,t,test=1,head,tail;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&n,&m);
		for(i=0;i<n;i++)scanf("%d",&a[i]);
		sort(a,a+n);
		for(i=0;i<n;i++)
			dp[i][1]=(a[i]-a[0])*(a[i]-a[0]);
		for(j=2;j<=m;j++)
		{
			head=0,tail=0;q[tail++]=j-2;
			for(i=j-1;i<n;i++)
			{
				while(head+1<tail)
				{
					k1=q[head],k2=q[head+1];
					if(dp[k2][j-1]-dp[k1][j-1]+a[k2+1]*a[k2+1]-a[k1+1]*a[k1+1]<2*a[i]*(a[k2+1]-a[k1+1]))
						head++;
					else break;
				}
				k1=q[head];
				dp[i][j]=dp[k1][j-1]+(a[i]-a[k1+1])*(a[i]-a[k1+1]);
				while(head+1<tail&&i!=n-1)
				{
					k1=q[tail-2],k2=q[tail-1],k3=i;
					x1=a[k1+1],x2=a[k2+1],x3=a[k3+1];
					y1=dp[k1][j-1]+a[k1+1]*a[k1+1];
					y2=dp[k2][j-1]+a[k2+1]*a[k2+1];
					y3=dp[k3][j-1]+a[k3+1]*a[k3+1];
					if((y3-y2)*(x2-x1)<=(y2-y1)*(x3-x2))
						tail--;
					else 
						break;
				}
				q[tail++]=i;
			}
		}
		printf("Case %d: %d/n",test++,dp[n-1][m]);
	}
	return 0;
}

      pku3709将一个含n个数的序列分为几个分为几个至少含有k个数的小序列,每个小序列的数都变为这个小序列最小的那个,每个数改变的和最小的那种情况就是所求。

#include<iostream>
using namespace std;

__int64 sum[110000],dp[110000],q[110000];
int main()
{
	__int64 n,f,i,j,k,head,tail,k1,k2,k3;
	while(scanf("%I64d%I64d",&n,&f)!=EOF)
	{
		sum[0]=0;
		for(i=1;i<=n;i++)
		{
			scanf("%I64d",&j);
			sum[i]=sum[i-1]+j;
		}
		head=tail=0;
		q[tail++]=0;
		for(i=f;i<=n;i++)
		{
			while(head+1<tail)
			{
				k1=q[head],k2=q[head+1];
				if((sum[i]-sum[k1])*(i-k2)<=(sum[i]-sum[k2])*(i-k1))
					head++;
				else 
					break;
			}
			k=q[head];
			dp[i]=1000*(sum[i]-sum[k])/(i-k);
			while(head+1<tail)
			{
				k1=q[tail-2],k2=q[tail-1],k3=i-f+1;
				if((sum[k2]-sum[k1])*(k3-k2)>=(sum[k3]-sum[k2])*(k2-k1))
					tail--;
				else 
					break;
			}
			q[tail++]=i-f+1;
		}

		for(k=0,i=f;i<=n;i++)
			if(dp[i]>k)
				k=dp[i];
		printf("%I64d/n",k);
	}
	return 0;
}

       pku1180

//将任务划分为不同的集合,同一个集合的任务在一个机器上运行
//同一集合的任务都有一个完成时间,但所有的输出时间都一样,
//等于前面集合的运行时间+开机时间S+这一集合上所有任务完成所需时间
//每个任务都有一个花销因子Fi,问怎么划分使得每个任务的Fi*输出时间和最少
//状态转移方程为:f[i]=min(f[k]+(ST[i]-ST[k]+S)*(F[n]-F[k]));
#include<iostream>//#include "stdafx.h" 
using namespace std;//#define int L//#define __int64  LL
const __int64 maxn=11000;
__int64 n,S,f[maxn],q[maxn],T[maxn],F[maxn],ST[maxn],SF[maxn];

__int64 C(__int64 k,__int64 i)
{
	return f[k]+(ST[i]-ST[k]+S)*(SF[n]-SF[k]);
}

int main()
{
	__int64 i,head,tail,k1,k2,k3,x1,x2,x3,y1,y2,y3;
	while(scanf("%I64d%I64d",&n,&S)!=EOF)
	{
		for(i=1;i<=n;i++)
			scanf("%I64d%I64d",&T[i],&F[i]);
		ST[0]=SF[0]=0;
		for(i=1;i<=n;i++)
		{
			ST[i]=ST[i-1]+T[i];
			SF[i]=SF[i-1]+F[i];
		}
		head=tail=0;
		q[tail++]=0;
		f[0]=0;
		for(i=1;i<=n;i++)
		{
			while(head+1<tail)
			{
				k1=q[head],k2=q[head+1];
				if(C(k2,i)<=C(k1,i))
					head++;
				else 
					break;
			}
			f[i]=C(q[head],i);
			while(head+1<tail)
			{
				k1=q[tail-2],k2=q[tail-1],k3=i;
				x1=SF[k1],x2=SF[k2],x3=SF[k3];
				y1=f[k1]-ST[k1]*(SF[n]-SF[k1]);
				y2=f[k2]-ST[k2]*(SF[n]-SF[k2]);
				y3=f[k3]-ST[k3]*(SF[n]-SF[k3]);
				if((y2-y1)*(x3-x2)>=(y3-y2)*(x2-x1))
					tail--;
				else 
					break;
			}
			q[tail++]=i;
		}
		printf("%I64d/n",f[n]);
	}
	return 0;
}

      斜率优化与四边形不等式的区别在于四边形不等式满足k续单调,而斜率只是保证取最优值的k单调。

Comsol超声空化气泡仿真入门:从零搭建模型到网格划分的完整流程 本文详细介绍了使用Comsol进行超声空化气泡仿真的完整流程,从物理基础理解到模型搭建、网格划分及求解器设置。通过具体步骤和示例代码,帮助初学者和工程师快速掌握这一关键技术,应用于医疗设备和工业清洗等领域。 阅读详情

相关推荐

《从0到1:CTFer成长之路》书籍配套题目-[第二章 web进阶]文件上传

[第二章 web进阶]文件上传开始行动绕过第1个限制绕过第2个限制 介绍:记录一下笔记,方便以后迅速回忆使用。 《从0到1:CTFer成长之路》书籍配套题目,来源网站:《从0到1:CTFer成长之路》 先看一下题目源码: <?php header("Content-Type:text/html; charset=utf-8"); // 每5分钟会清除一次目录下上传的文件 require_once('pclzip.lib.php'); if(!$_FILES){ echo '

weixin_46703850的博客 3407

【HDU3480】Division 斜率优化/四边形不等式优化

原题走这里 首先很容易想到给原数组排序,于是最大值和最小值就变成最左和最右。明显是选取连续的区间最优,于是原问题就转化为了区间DP,设前iii个中选取jjj个区间的最优解为d[i][j]d[i][j]d[i][j],转移方程: d[i][j]=min(d[i−1][k]+(s[j]−s[k])2)d[i][j]=min(d[i−1][k]+(s[j]−s[k])2)d[i][j]=min(d[...

CRTorlonia的博客 423

最新版IAR9.40和注册工具

IAR最新版的IDE在编译速度和代码提示等各个方面上都有很大提升,软件这个东西果然还是越新越好。之前的时候,IAR v9系列网上很多人都说能用,但是又没有把 IAR v9系列的注册方法写的很清楚,导致我一直都用注册老版本v8的方法去注册v9。结果注册后都会提示。

xue_nuo的博客 4万+

hdu 3480 dp 四边形不等式优化

给出一个数字集合 S,大小为 n,要求把这个集合分成m个子集,每分出一个子集的费用是子集中的 (max-min)^2,求最小费用。 开始的dp转移很容易想到。 首先对集合从小到大排序,dp[i][j] 表示前i个元素被分成j个子集的最小费用。然后枚举最后一个子集。 dp[i][j] = min{dp[k-1][j-1] + cost(k, i)};

xuelanghu407 1038

告别复杂配置!5分钟在Vue/React项目中集成讯飞语音听写WebSocket API

本文详细介绍了如何在Vue/React项目中快速集成讯飞语音听写WebSocket API,实现高效语音识别功能。通过对比不同通信方案,突出WebSocket在实时语音交互中的优势,并提供框架适配、音频处理及性能优化等关键技术点,帮助开发者5分钟内完成专业级语音听写功能集成。

weixin_28730353的博客 270

Apollo control模块横向控制原理及核心代码逐行解析

看完这篇文章,你会对apollo横向控制有一个整体的概念

weixin_39199083的博客 2万+

HDU 3480 Division 斜率DP

Division HDU - 3480 令 TTT 表示一个整数的集合,MIN,MAXMIN,MAXMIN,MAX 分别是这个集合中最小和最大的数,定义这个集合的花费为 (MAX−MIN)2(MAX-MIN)^2(MAX−MIN)2。 先给定一个整数集合 SSS,希望找到 MMM 个 SSS 的子集 S1,S2,⋯SMS_1,S_2,\cdots S_MS1​,S2​,⋯SM​,使得 S1∪S2∪...

wineandchord 270

手把手教你:基于STM32H7自制飞控,如何从零开始移植PX4固件(附避坑指南)

本文详细介绍了如何基于STM32H7自制飞控板并移植PX4固件的完整流程,包括硬件设计、开发环境搭建、关键配置文件移植、驱动开发与适配等关键步骤。特别针对PX4-AutoPilot的移植过程提供了实用技巧和避坑指南,帮助开发者高效完成飞控系统开发。

weixin_30271335的博客 138

斜率优化 hdu3480 pku3709 pku1180 pku2180

斜率优化是DP优化的一种,假设状态转移方程为dp[i]=min or max (dp[k]+w[i,k]),我们假设取其中两个解k1,k2(不妨设k1       但是对i的单调性是建立在k1f[ii]时,G(k2,k3)也会>f[ii],此时k3会比k2优.所以此时可以把k2去掉,去掉后G(k1,k2)会保持单调递减,所以把此时的f[ii]插入到G(k1,k2)中,前面的G(k1,k2)都

773

新手入门机器学习案例(附源代码)

无

guguo666的博客 6648

VSCode+PlatformIO新建工程卡成狗?3步提速大法实测有效(附镜像源配置)

针对VSCode+PlatformIO新建工程时因依赖下载缓慢导致的加载慢问题,本文提供了三步核心提速方案。通过配置Python环境变量、修改PlatformIO插件设置以使用国内镜像源,并优化pip配置文件,实测可大幅缩短工程创建时间,有效解决创建工程卡顿的痛点。

delta的博客 697

HDU3480(Division 斜率优化dp入门题)

题目 题意: n个数分成m组,每组的花费是(max-min)^2,求最小花费; 先对所有数字的权值从小到大排序。 dp[i][j]:前 j 个数分成 i 组. 则转移方程为:dp[i][j]=dp[i-1][k]+(a[j]-a[k+1])^2.(0<=k<j) 把外层循环 i 看作定值,j 是状态变量,k 是决策变量。方程存在项 2 * a[j] * a[k+1],应考虑使用斜率优化...

qq_42576687的博客 374

SAP-ABAP:ABAP Development Tools(ADT)安装配置学习分享教程-第一篇:ADT安装前置准备与环境校验教程

ABAP Development Tools(ADT)安装配置教程摘要 本文是ADT安装系列的第一篇,重点讲解环境准备与版本校验。ADT是基于Eclipse的现代ABAP开发工具,相比传统SAP GUI提供更智能的开发体验。安装前需确认: 推荐使用Eclipse 2026-03 + Java 21组合 操作系统需Windows 10+/macOS 14+ SAP GUI版本要求Windows≥8.00/macOS≥8.10 后端系统需NetWeaver 7.31 SP04+或S/4HANA 通过java -

baidu_35680696的博客 666

HDU - 3480 Division(四边形优化)

题目大意:给出N个数,要求你分成M个集合,使得每个集合的(最大值 - 最小值)^2的和达到最小解题思路:先排个序 用dp[i][j]表示前几个数字分成i个集合的最小和 则dp[i][j] = dp[i - 1][k] + w[k + 1][j] w[k + 1][j]表示[k + 1, j]这个集合的(最大值-最小值) ^ 2#include <cstdio> #include <cstrin

静静地码 579

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

HDU3480-----用四边形不等式优化的DP

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3480 题意: 给你n个数字,要你把他们划分成m个集合 然后每个集合付出的代价就是每个集合中最大值减最小值的平方 要你求出在最有划分后使得总的代价最小 我们可以先进行排序,然后得出状态方程: dp[i][j] = min{dp[i-1][k] + (a[j]-a[k+1])*(a[j]-a[

Bob Lee's Blog For CS 844

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

HDU 3480 Division 题解

Hdu 3480

中国计算机学会成都七中(高新校区)委员会委员活动室 388

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

HDU 3480 (斜率优化)

题目链接:点击这里题意: 给出一个数字集合S, 要求m个子集, 使得子集并等于S, 并且每一个子集的花费和最小. 一个集合的花费等于最大元素减去最小元素的平方.显然贪心的想一下是最后肯定是数列排完序之后划分一下. 然后costi,j=(aj−ai)2cost_{i,j}=(a_j-a_i)^2, 转移方程就是fi=min{fj+(ai−aj+1)2∣∣j<i}f_i=min\left\{ f_j+(

morejarphone~ 434

HDU3480 Division——四边形不等式或斜率优化

题目大意 将N个数分成M部分,使每部分的最大值与最小值平方差的和最小。 思路 首先肯定要将数列排序,每部分一定是取连续的一段,于是就有了方程 $\Large f(i,j)=min(f(i-1,k-1)+(a_j-a_k)^2)$ 其中$f(i,j)$表示前$j$个数分成$i$部分的最小值 解法一.四边形不等式优化 设$w(i,j)=(a_j-a_i)^2$ 方程变为$f(i,j)=...

weixin_30363509的博客 163

hdu 3480 Division(dp四边形优化)

题意: 给出n个数,让你把它分成m个集合,不同集合间允许有相同元素,所有集合的并集为全集,使得集合的代价和最小。单个集合的代价为集合中最大值与最小值的差值。 题解: 这题看过去发现序列可以任意排列,好像不能用dp,很棘手的样子,那么我们可以这样分析一下对于4个数1 4 7 9 我们分成两个集合怎么和分?如果1和7 4和9显然不能最有,1和4 7和9呢?是最优了! 那么这个例子我们看出如果将序

ACM之梦 746

hdu 3480 Division (四边形不等式优化DP)

题目描述传送门题目大意:将n个数划分到m个集合中,每个集合的代价是集合中最大元素与最小元素差的平方。求划分的最小代价。题解这个问题可以贪心的想,必然是权值接近的分成一个集合。 那么我们只要把权值排序,问题就又变成了划分问题。 f[j][i]=min{f[k][i−1]+(val[j]−val[k+1])∗(val[j]−val[k+1])}f[j][i]=min\{f[k][i-1]+(val[

clover_hxy的博客 504

dp四边形优化 Hdu 3480 Division 题解

累加器传送门:http://blog.csdn.net/NOIAu/article/details/71775000题目传送门:https://cn.vjudge.net/problem/HDU-3480dp状态转移分析博客:http://blog.csdn.net/NOIAu/article/details/72428364由于在斜率优化的博客里已经讲解了如何dp转移,这里就不在赘述,显然cost

Monica 1971

HDU3480(斜率dp)

Problem Description Little D is really interested in the theorem of sets recently. There’s a problem that confused him a long time. Let T be a set of integers. Let the MIN be the minimum integer in ...

T__TSZ的博客 492

HDU 3480 斜率优化DP

题目链接终于完全靠自己过掉了一道基础的斜率优化DPDP的思路很直接,一开始看数据范围,还以为不用优化可能卡过去,然后就直接写了三重循环DP,果然超时没商量= = for(int i=1 ;i<=n ;i++) scanf("%d",&a[i]); sort(a+1,a+n+1); for(int i=1 ;i<=n ;i++){ for(int

新熊君的博客 580

hdu 3480 斜率dp

传送门 题意: 给你一个有n个数的集合S,现在让你选出m个子集合,使这m个子集合并起来为S,并且每个集合的(max-min)2 之和要最小。 题解: 运用贪心的思想,肯定首先将全部的数排好序,然后设dp[i][j]表示前j个数分为i个集合的最优解。 则有dp[i][j]=min{dp[i-1][k]+(a[j]-a[k+1])2}(0 #include us

twh233的算法blog 312

hdu 3480 Division (斜率优化||四边形不等式)

Division Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 999999/400000 K (Java/Others) Total Submission(s): 2676    Accepted Submission(s): 1056 Problem Description Little D is re

To be what you what to be! 2018

hdu-3480 Division

hdu-3480 division

Venishel的博客 444
上一篇: Codeforces Beta Round #67 (Div. 2) ABCD
下一篇: 阿里巴巴杯与武大第六届中部地区邀请赛的其中几题
ahero_happy
博客等级 码龄17年 33粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值