动态规划之队列优化

合集下载

排队问题的三种方法

排队问题的三种方法

排队问题的三种方法
排队问题的三种方法如下:
1. 经典方法:经典方法是解决排队问题的一种方法。

这种方法基于队列的基本概念,将排队系统中的元素看作队列中的元素,并考虑一些基本的操作,如插入、删除和移动元素。

经典方法通常包括以下步骤:
- 确定元素数目和优先级。

- 创建一个初始队列,并确定队列长度。

- 确定哪些元素需要移动到新的位置。

- 确定哪些元素需要删除。

- 执行操作,并将结果更新队列。

2. 动态规划方法:动态规划方法是解决排队问题的一种重要方法。

这种方法将问题划分为若干个子问题,并使用状态转移方程来解决问题。

状态转移方程通常包括以下步骤:
- 确定当前队列中元素数目和优先级。

- 根据优先级和元素数目,确定新状态。

- 在新状态中,根据优先级和元素数目,确定新队列的长度和元素数目。

- 根据新状态,解决问题。

3. 贪心算法:贪心算法是解决排队问题的一种重要方法。

这种方法假设元素具有一些基本性质,例如都具有一定的优先级和数目,并根据这些性质来解决问题。

贪心算法通常包括以下步骤:
- 确定当前队列中元素数目和优先级。

- 根据优先级和元素数目,确定新元素的可能性。

- 确定最可能的新元素,并插入到队列中。

- 如果新元素插入后,队列长度发生变化,重新考虑最可能的新元素。

动态规划算法的优化技巧

动态规划算法的优化技巧

动态规划算法的优化技巧福州第三中学毛子青[关键词] 动态规划、时间复杂度、优化、状态[摘要]动态规划是信息学竞赛中一种常用的程序设计方法,本文着重讨论了运用动态规划思想解题时时间效率的优化。

全文分为四个部分,首先讨论了动态规划时间效率优化的可行性和必要性,接着给出了动态规划时间复杂度的决定因素,然后分别阐述了对各个决定因素的优化方法,最后总结全文。

[正文]一、引言动态规划是一种重要的程序设计方法,在信息学竞赛中具有广泛的应用。

使用动态规划方法解题,对于不少问题具有空间耗费大、时间效率高的特点,因此人们在研究动态规划解题时更多的注意空间复杂度的优化,运用各种技巧将空间需求控制在软硬件可以承受的范围之内。

但是,也有一部分问题在使用动态规划思想解题时,时间效率并不能满足要求,而且算法仍然存在优化的余地,这时,就需要考虑时间效率的优化。

本文讨论的是在确定使用动态规划思想解题的情况下,对原有的动态规划解法的优化,以求降低算法的时间复杂度,使其能够适用于更大的规模。

二、动态规划时间复杂度的分析使用动态规划方法解题,对于不少问题之所以具有较高的时间效率,关键在于它减少了“冗余”。

所谓“冗余”,就是指不必要的计算或重复计算部分,算法的冗余程度是决定算法效率的关键。

动态规划在将问题规模不断缩小的同时,记录已经求解过的子问题的解,充分利用求解结果,避免了反复求解同一子问题的现象,从而减少了冗余。

但是,动态规划求解问题时,仍然存在冗余。

它主要包括:求解无用的子问题,对结果无意义的引用等等。

下面给出动态规划时间复杂度的决定因素:时间复杂度=状态总数*每个状态转移的状态数*每次状态转移的时间[1]下文就将分别讨论对这三个因素的优化。

这里需要指出的是:这三者之间不是相互独立的,而是相互联系,矛盾而统一的。

有时,实现了某个因素的优化,另外两个因素也随之得到了优化;有时,实现某个因素的优化却要以增大另一因素为代价。

因此,这就要求我们在优化时,坚持“全局观”,实现三者的平衡。

CCF中学生计算机程序设计能力评级信息学奥赛NOIP动态规划算法及优化

CCF中学生计算机程序设计能力评级信息学奥赛NOIP动态规划算法及优化
1 ≤ n ≤ 5000, 1 ≤ b, ci, di ≤ 109。
动态规划算法 及优化
Codeforces 815C Karen and Supermarket
背包类问题 数据结构优化 决策单调性 计数
可以发现依赖关系形成了一棵树,因此可以考虑在树上
进行 DP。需要注意的是,本题中物品的价格可能非常大, 但是每个物品的收益只有 1,因此我们 DP 时第二维表示的 应当是买了多少个物品。
动态规划算法 及优化
背包类问题 数据结构优化 决策单调性 计数
动态规划算法及优化
动态规划算法 及优化
背包问题
背包类问题 数据结构优化 决策单调性 计数
01 背包:n 个物品,每个物品有价格 ci 及收益 wi ,问 m 元最多能得到多少收益。
完全背包:n 种物品,每种物品有价格 ci 及收益 wi,并 且每种物品能买无限个,问 m 元最多能得到多少收益。
n ≤ 500, m ≤ 4000, di ≤ 100。
动态规划算法 及优化
BZOJ4182 Shopping
背包类问题 数据结构优化 决策单调性 计数
先考虑我们知道必选某个节点时怎么做。可以把这个点
当成根,那么问题就转化为了一个树上依赖背包问题。 考虑用和上一题类似的方法进行 DP。令 fi,j 表示在节点
背包类问题 数据结构优化 决策单调性 计数
树上依赖背包其实还有一个经典的做法。考虑一边 dfs 一边 DP。dfs 到节点 i 的时候,我们先把 DP 数组拷贝一份, 表示不选 i 的子树时的背包。接着我们用多重背包的做法加 入商品 i,并且强制至少买一个商品 i。然后我们再依次 dfs 进每个儿子的子树中,回溯到 i 时我们就得到了在 i 的子树 中买了物品的背包,把它与原先拷贝的背包取个 max 即可。 这样复杂化即可。这样加入一个物品的复杂度是 O(m)

动态规划之队列优化

动态规划之队列优化

动态规划之队列优化浙江省镇海中学 贺洪鸣【例1锯木场选址】(CEOI2004)从山顶上到山底下沿着一条直线种植了n 棵树。

当地的政府决定把他们砍下来。

为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂。

木材只能按照一个方向运输:朝山下运。

山脚下有一个锯木厂。

另外两个锯木厂将新修建在山路上。

你必须决定在哪里修建两个锯木厂,使得传输的费用总和最小。

假定运输每公斤木材每米需要一分钱。

任务你的任务是写一个程序:从标准输入读入树的个数和他们的重量与位置 计算最小运输费用将计算结果输出到标准输出 输入输入的第一行为一个正整数n ——树的个数(2≤n ≤20 000)。

树从山顶到山脚按照1,2……n 标号。

接下来n 行,每行有两个正整数(用空格分开)。

第i +1行含有:v i ——第i 棵树的重量(公斤为单位)和 d i ——第i 棵树和第i +1棵树之间的距离,1≤v i ≤10 000,0≤d i ≤10 000。

最后一个数d n ,表示第n 棵树到山脚的锯木厂的距离。

保证所有树运到山脚的锯木厂所需要的费用小于2000 000 000分。

输出输出只有一行一个数:最小的运输费用。

样例输入 91 22 13 31 1 32 1 6 2 1 1 2 1 1在解决这一问题时,首先我们要明确,将锯木厂建立在相邻两棵树之间是没有任何意义的,否则我们可以将这样的锯木厂上移到最近的一棵树处,此时运送上方树木的费用减少,运送下方树木的费用没有变化,总费用降低。

为了方便讨论,我们先作如下定义:假设山脚锯木场处也有一棵树,编号为1n +,并且v[n+1]=d[n+1]=0。

][i sumw 表示第1棵树到第i 棵树的质量和,即∑==ij j w i sumw 1][][。

][i sumd 表示第1棵树到第i 棵树的距离,即∑-==11][][i j j d i sumd 。

特别的,有0]1[=sumd ,表示第1棵树到自己的距离为0。

最优化多目标规划动态规划

最优化多目标规划动态规划

最优化多目标规划动态规划多目标规划是指在决策问题中同时考虑多个目标的优化问题,其目标可能相互矛盾或者相互关联。

动态规划是一种通过将问题划分为子问题并利用子问题的最优解来求解整体最优解的方法。

将多目标规划与动态规划结合起来,可以解决一些具有多个相互关联目标的决策问题。

下面将介绍最优化多目标规划动态规划的原理和应用举例。

1.定义决策变量:确定需要作出的决策,并定义决策变量。

2.建立状态转移方程:将问题划分为多个子问题,并建立它们之间的状态转移方程。

状态转移方程描述了子问题之间的关系,通过子问题之间的转移可以得到整体问题的最优解。

3.确定初始状态和边界条件:确定初始状态和边界条件,即子问题的初始状态和边界条件,用于递归地求解子问题。

4.递推求解:使用动态规划的递推求解方法,从初始状态开始,逐步求解子问题,直到求解出整体的最优解。

5.分析最优解:根据求解结果分析得到的最优解,并根据需要进行调整和优化。

假设有一家公司要进行产品的生产安排,公司有多个产品需要安排生产,每个产品有不同的生产时间和利润,同时公司还要考虑生产能力的限制和产品订单的要求。

问题可以建立如下的数学模型:决策变量:对于每个产品,决定其生产数量。

目标函数:最大化总利润。

约束条件:生产时间不能超过生产能力限制,同时生产数量要满足订单要求。

利用动态规划方法可以将问题分解为多个子问题,以子问题的最优解作为动态规划的递推依据。

具体步骤如下:1.将产品的生产时间和利润作为状态,根据时间顺序划分为多个子问题。

2.定义状态转移方程,将子问题的最优解与前面子问题的最优解关联起来。

3.初始状态为生产时间为0的情况,边界条件为订单要求。

4.递推求解,根据状态转移方程求解每个子问题的最优解。

5.分析最优解,确定每个产品的生产数量,以及总利润。

通过最优化多目标规划动态规划的方法,可以在满足多个目标和约束条件的情况下,求解出最优的决策方案。

这种方法可以应用于生产调度、资源分配、物流配送等领域,帮助企业做出合理的决策,达到优化目标。

动态规划问题的基本要素和最优化原理ppt课件

动态规划问题的基本要素和最优化原理ppt课件
2、正确选择状态变量
选择变量既要能确切描述过程演变又要满足无后效性, 而且各阶段状态变量的取值能够确定。一般地,状态变量 的选择是从过程演变的特点中寻找。
3、确定决策变量及允许决策集合
通常选择所求解问题的关键变量作为决策变量,同时要 给出决策变量的取值范围,即确定允许决策集合。
精品课程《运筹学》
ppt精选版
4、确定状态转移方程
根据k 阶段状态变量和决策变量,写出k+1阶段状态变 量,状态转移方程应当具有递推关系。
5、确定阶段指标函数和最优指标函数,建立动 态规划基本方程
阶段指标函数是指第k 阶段的收益,最优指标函数是指 从第k 阶段状态出发到第n 阶段末所获得收益的最优值, 最后写出动态规划基本方程。
f1(s1)
最优目标函数值
V 1 * ,n V 1 * ,n (s 1 * ,u 1 * 子, 从策略k ,的到s 最终n * 优点,u 目最n * 标优)函策数略值
fs ov ps tu s
, , ,
k k
k ,n k k
uu , ,
k
n
n 1
精品课程《运筹学》
ppt精选版
§2.2 动态规划的基本思想
最优化原理:作为整个过程的最优策略具有这样 的性质:无论过去的状态和决策如何,相对于前面 的决策所形成的状态而言,余下的决策序列必然构 成最优子策略。”也就是说,一个最优策略的子策 略也是最优的。
精品课程《运筹学》
ppt精选版
§2.3 建立动态规划模型的步骤
1、划分阶段
划分阶段是运用动态规划求解多阶段决策问题的第一步, 在确定多阶段特性后,按时间或空间先后顺序,将过程划 分为若干相互联系的阶段。对于静态问题要人为地赋予 “时间”概念,以便划分阶段。

动态规划算法的优化技巧

动态规划算法的优化技巧

动态规划算法的优化技巧福州第三中学毛子青[关键词] 动态规划、时间复杂度、优化、状态[摘要]动态规划是信息学竞赛中一种常用的程序设计方法,本文着重讨论了运用动态规划思想解题时时间效率的优化。

全文分为四个部分,首先讨论了动态规划时间效率优化的可行性和必要性,接着给出了动态规划时间复杂度的决定因素,然后分别阐述了对各个决定因素的优化方法,最后总结全文。

[正文]一、引言动态规划是一种重要的程序设计方法,在信息学竞赛中具有广泛的应用。

使用动态规划方法解题,对于不少问题具有空间耗费大、时间效率高的特点,因此人们在研究动态规划解题时更多的注意空间复杂度的优化,运用各种技巧将空间需求控制在软硬件可以承受的范围之内。

但是,也有一部分问题在使用动态规划思想解题时,时间效率并不能满足要求,而且算法仍然存在优化的余地,这时,就需要考虑时间效率的优化。

本文讨论的是在确定使用动态规划思想解题的情况下,对原有的动态规划解法的优化,以求降低算法的时间复杂度,使其能够适用于更大的规模。

二、动态规划时间复杂度的分析使用动态规划方法解题,对于不少问题之所以具有较高的时间效率,关键在于它减少了“冗余”。

所谓“冗余”,就是指不必要的计算或重复计算部分,算法的冗余程度是决定算法效率的关键。

动态规划在将问题规模不断缩小的同时,记录已经求解过的子问题的解,充分利用求解结果,避免了反复求解同一子问题的现象,从而减少了冗余。

但是,动态规划求解问题时,仍然存在冗余。

它主要包括:求解无用的子问题,对结果无意义的引用等等。

下面给出动态规划时间复杂度的决定因素:时间复杂度=状态总数*每个状态转移的状态数*每次状态转移的时间[1]下文就将分别讨论对这三个因素的优化。

这里需要指出的是:这三者之间不是相互独立的,而是相互联系,矛盾而统一的。

有时,实现了某个因素的优化,另外两个因素也随之得到了优化;有时,实现某个因素的优化却要以增大另一因素为代价。

因此,这就要求我们在优化时,坚持“全局观”,实现三者的平衡。

排队问题的三种方法

排队问题的三种方法

排队问题的三种方法排队问题是一类经典的图论问题,通常涉及到在一条流水线上安排生产任务或者服务请求,使得所有任务或者请求都能够及时完成,本文将介绍三种解决排队问题的方法。

方法一:贪心算法贪心算法是一种简单的算法思想,通过每次选择最优解来得到全局最优解。

在排队问题中,贪心算法可以通过不断尝试最坏情况来得到最优解。

具体来说,我们可以从最后一个待安排的任务开始,依次将当前任务和已经安排的任务进行交换,直到任务队列为空。

这种方法能够保证所有的任务都能够及时完成,但是可能会出现任务队列为空的情况,也就是没有任务可以安排。

方法二:动态规划算法动态规划算法是一种通过构建状态转移方程来求解问题的方法,通常适用于问题的规模较大或者最优解不是唯一的情况。

在排队问题中,我们可以将任务队列看作是状态,任务等待时间和执行任务的时间看作是状态转移方程。

具体来说,我们可以从最后一个待安排的任务开始,依次计算出当前任务需要等待的时间和已经安排的任务需要执行的时间,然后将当前任务和已经安排的任务进行交换,直到任务队列为空。

这种方法可以得到最优解,但是需要计算大量的状态转移方程。

方法三:图论算法图论算法是一种通过构建图来分析问题的方法,通常适用于问题的规模较大或者最优解不是唯一的情况。

在排队问题中,我们可以将任务队列看作是一个图,任务之间的等待关系看作是边,然后通过最小生成树或者贪心算法来得到最优解。

具体来说,我们可以从最后一个待安排的任务开始,依次将当前任务和已经安排的任务进行交换,直到任务队列为空。

这种方法可以得到最优解,但是需要计算大量的边。

以上三种方法是解决排队问题的常见方法,贪心算法适用于没有最优解的情况,动态规划算法适用于有多个最优解的情况,图论算法适用于问题规模较大的情况。

此外,排队问题的拓展应用还有很多,例如排队论、排队系统、排队论模型等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

动态规划之队列优化浙江省镇海中学 贺洪鸣【例1锯木场选址】(CEOI2004)从山顶上到山底下沿着一条直线种植了n 棵树。

当地的政府决定把他们砍下来。

为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂。

木材只能按照一个方向运输:朝山下运。

山脚下有一个锯木厂。

另外两个锯木厂将新修建在山路上。

你必须决定在哪里修建两个锯木厂,使得传输的费用总和最小。

假定运输每公斤木材每米需要一分钱。

任务你的任务是写一个程序:从标准输入读入树的个数和他们的重量与位置 计算最小运输费用将计算结果输出到标准输出 输入输入的第一行为一个正整数n ——树的个数(2≤n ≤20 000)。

树从山顶到山脚按照1,2……n 标号。

接下来n 行,每行有两个正整数(用空格分开)。

第i +1行含有:v i ——第i 棵树的重量(公斤为单位)和 d i ——第i 棵树和第i +1棵树之间的距离,1≤v i ≤10 000,0≤d i ≤10 000。

最后一个数d n ,表示第n 棵树到山脚的锯木厂的距离。

保证所有树运到山脚的锯木厂所需要的费用小于2000 000 000分。

输出输出只有一行一个数:最小的运输费用。

样例输入 91 22 13 31 1 32 1 6 2 1 1 2 1 1在解决这一问题时,首先我们要明确,将锯木厂建立在相邻两棵树之间是没有任何意义的,否则我们可以将这样的锯木厂上移到最近的一棵树处,此时运送上方树木的费用减少,运送下方树木的费用没有变化,总费用降低。

为了方便讨论,我们先作如下定义:假设山脚锯木场处也有一棵树,编号为1n +,并且v[n+1]=d[n+1]=0。

][i sumw 表示第1棵树到第i 棵树的质量和,即∑==ij j w i sumw 1][][。

][i sumd 表示第1棵树到第i 棵树的距离,即∑-==11][][i j j d i sumd 。

特别的,有0]1[=sumd ,表示第1棵树到自己的距离为0。

c[i]表示在第i 棵树处建一个锯木厂,并且将第1到第i 棵树全部运往这个伐木场所需的费用。

显然有c[i]=c[i-1]+sumw[i-1]*d[i-1]。

特别的,有c[1]=0。

w[j,i]表示在第i 棵树处建一个锯木场,并且将第j 到第i 棵树全部运往这个锯木场所需的费用。

则w[j,i]=c[i]-c[j-1]-sumw[j-1]*(sumd[i]-sumd[j-1])。

特别的,当i<=j 时w[j,i]=0。

综上可知,求出所有sumw[i],sumd[i]与c[i]的时间复杂度为O(n),此后求任意w[j,i]的时间复杂度都为O(1)。

设f[i]表示在第i 棵树处建立第二个锯木场的最小费用,则有11[]min {[][1,][1,1]}j i f i c j w j i w i n ≤=≤-=+++++。

直接用这个式子计算的时间复杂度为)(2n O ,由于问题规模太大,直接使用这一算法必然超时,因此我们必须对算法进行优化。

在讨论如何进行优化以前,我们首先证明下面这一猜想。

[猜想]如果在位置i 建设第二个锯木厂,第一个锯木厂的位置是j 时最优。

那么如果在位置i+1建设第二个锯木厂,第一个锯木厂的最佳位置不会小于j 。

证明:假设第1个锯木厂建立在第j 个处时,f[i]取得最优值,且此时j 为f[i]取得最优值时的最小值,如下图所示.此时f[i]=c[j]+w[j+1,i]+w[i+1,n+1] 则对于任意的k<j,c[k]+w[k+1,i]+w[i+1,n+1]>c[j]+w[j+1,i]+w[i+1,n+1]即求f[i+1]时,决策k 比决策j 来得差!因此,当f[i]的第一个最佳决策为j 时,f[i+1]的第一个最优决策必大于等于j!证毕!【算法的改进】令s[k,i]表示决策变量取k 时f[i]的值,即s[k,i]=c[k]+w[k+1,i]+w[i+1,n+1]。

设k1<k2,则有s[k1,i]-s[k2,i]=(c[k1]+w[k1+1,i]+w[i+1,n+1])-(c[k2]+w[k2+1,i]+w[i+1,n+1]) =(c[k1]+c[i]-c[k1]-sumw[k1]*(sumd[i]-sumd[k1]) - (c[k2]+c[i]-c[k2]-sumw[k2]*(sumd[i]-sumd[k2])=sumw[k2]*(sumd[i]-sumd[k2])- sumw[k1]*(sumd[i]-sumd[k1])1j+1 i+1 i n+1锯木厂 C[j] w[j+1,i] w[i+1,n+11 k K+1 i+1 i n+1C[k] w[k+1,i] w[i+1,n+1]1 j j+1 i+1 i n+1 锯木厂 C[j] w[j+1,i+1]w[i+2,n+1]1k K+1 i+1 in+1 C[k] w[k+1,i+1] w[i+2,n+1] c[k]+w[k+1,i]>c[j]+w[j+1,i] c[k]+w[k+1,i]+(sumw[i]-sumw[k])*d[i]>c[j]+w[j+1,i]+(sumw[i]-sumw[k])*d[i]c[k]+w[k+1,i+1]>c[j]+w[j+1,i+1] c[k]+w[k+1,i+1]+w[i+2,n+1]>c[j]+w[j+1,i+1]+w[i+2,n+1]第k+1至第i 的总重量 第i 至第i+1的距离 第j+1至第i 的总重量, 必小于第k+1至第i 的总重量=sumd[i](sumw[k2]-sumw[k1])-(sumw[k2]*sumd[k2]-sumw[k1]*sumd[k1])若s[k1,i]-s[k2,i]<0,则有:sumd[i](sumw[k2]-sumw[k1])<(sumw[k2]*sumd[k2]-sumw[k1]*sumd[k1])即(sumw[k2]*sumd[k2]-sumw[k1]*sumd[k1])/ (sumw[k2]-sumw[k1])> sumd[i]或(sumw[k1]*sumd[k1]-sumw[k2]*sumd[k2])/ (sumw[k1]-sumw[k2])> sumd[i] 我们令g[k1,k2]=不等式左边,当g[k1,k2]>sumd[i]时s[k1,i]-s[k2,i]<0。

由上面已经证明的猜想,说明决策变量j是单调的,(即f[i+1]的决策j2必大于等于f[i]时的决策j1)此时问题就好解决了。

我们可以维护一个特殊的队列k,这个队列只能从队尾插入,但是可以从两端删除。

这个队列满足k1<k2<k3<…<k p以及g[k1,k2]<g[k2,k3]<…<g[k p-1,k p]。

1.计算状态f[i]前,若g[k1,k2]<sumd[i],表示s[k1,i]-s[k2,i]>0,即决策k1没有k2优,应当删除队首,将k1,k2,指针后移,直至g[k1,k2]>sumd[i]。

此时, s[k1,i]-s[k2,i]<0, 即决策k1比k2优。

2.计算状态f[i]时,直接使用决策k1,f[i]=c[k1]+w[k1+1,i]+w[i+1,n+1]。

O(1)代价!(由当前的决策序列:sumd[i]<g[k1,k2]<g[k2,k3]<…<g[k p-1,kp]知,决策k1优于k2,k2优于k3,…,k p-1优于k p。

)3.计算状态f[i]后向队列插入新的决策i。

若g[k p-1,k p]>g[k p,i],此时,如果求某个f[r]时选择K p为决策,则k p-1决策必然没有k p好,即s[k p-1,r]-s[k p,r]>0 => g[k p-1,k p]<sumd[r]=> g[k p,i]<sumd[r]=> s[k p,r]-s[i,r]>0,此时,说明决策i必然比k p来得优表示在k p比k p-1优之前i就将比k p优,k p没必要保存。

并且,根据前面的猜想,对于以后的状态,决策i也会比k p优。

因此删除k p,将指针p前移,直至g[k p-1,k p]< g[k p,i]。

队列中的元素只会入队一次,出队一次,维护队列k的总复杂度为O(n),因此每个状态f[i]计算的均摊复杂度都为O(1),整个算法的时间复杂度为O(n)。

问题得到解决!注意:上例的决策单调性的条件是,每棵树的重量均>0,这样,重量前缀数组sumw满足单调性,才会满足第j+1至第i的总重量,必小于第k+1至第i的总重量(k<j)。

【例2仓库建设】(浙江2007L公司有N如右图所示,工厂1在山顶,工厂NL公司一般把产品直接堆放在露天,以节省费用。

突然有一天,L公司的总裁L先生接到是不同的。

第i个工厂目前已有成品Pi件,在第i个工厂位置建立仓库的费用是Ci。

对于没有建立仓库的工厂,其产品应被运往其他的仓库进行储藏,而由于L公司产品的对外销售处设置在山脚的工厂N,故产品只能往山下运(即只能运往编号更大的工厂的仓库),当然运送产品也是需要费用的,假设一件产品运送1个单位距离的费用是1。

假设建立的仓库容量都都是足够大的,可以容下所有的产品。

你将得到以下数据:工厂i距离工厂1的距离Xi(其中X1=0);工厂i目前已有成品数量Pi;在工厂i建立仓库的费用Ci;请你帮助L公司寻找一个仓库建设的方案,使得总的费用(建造费用+运输费用)最小。

【输入文件】输入文件storage.in第一行包含一个整数N,表示工厂的个数。

接下来N行每行包含两个整数Xi, Pi, Ci, 意义如题中所述。

【输出文件】输出文件storage.out 仅包含一个整数,为可以找到最优方案的费用。

【样例输入】30 5 105 3 1009 6 10【样例输出】32【样例说明】在工厂1和工厂3建立仓库,建立费用为10+10=20,运输费用为(9-5)*3 = 12,总费用32。

如果仅在工厂3建立仓库,建立费用为10,运输费用为(9-0)*5+(9-5)*3=57,总费用67, 不如前者优。

【初步分析】1.状态表示以sump[i]表示第1个工厂至第i 个工厂中的总的产品数量;以sumw[i]表示将第1个工厂至第i 个工厂的所有产中运至第i 个工厂的费用; 以w[i,j]表示将第i 个工厂至第j 个工厂的所有产中运至第j 个工厂的费用。

W[i,j]=sumw[j]-sumw[i-1]-sump[i-1]*(x[j]-x[i-1])所有的sump[1..n]、sumw[1..n]可在O(n)的总次数内算出,每个w[i,j]可以O(1)算出。

相关文档
最新文档