1245 尼克的任务【动态规划】 1246 书的复制【动态规划】

合集下载

动态规划的实施步骤

动态规划的实施步骤

动态规划的实施步骤什么是动态规划?动态规划(Dynamic Programming,简称DP)是一种在数学、计算机科学和经济学中使用的算法的优化技术。

动态规划基于分阶段决策的理念,通过将一个大问题划分为一系列的子问题,并按照一定的顺序求解这些子问题,最终达到求解整个问题的目的。

动态规划可以有效地解决多阶段决策问题,避免了重复计算,提高了问题求解的效率。

动态规划的实施步骤动态规划的实施步骤通常可以分为以下几个步骤:1. 定义状态在动态规划中,首先需要定义问题的状态。

状态是指解决问题所需要的关键信息,它可以是一个值、一个数组或一个矩阵等。

状态的选择要满足两个条件:一是要能够用于问题的求解,二是要能够通过已知信息推导出后续状态。

状态的定义往往是问题的关键和难点之一。

2. 确定状态转移方程状态转移方程是动态规划问题的核心,它描述了问题的当前状态与下一个状态之间的关系。

通过定义好状态转移方程,我们可以逐步求解问题的解。

状态转移方程通常有两种形式:递推式和递归式。

递推式是指从已知状态推导出后续状态的公式,递归式是指将问题的求解转化为更小规模的子问题的表达式。

3. 初始化边界条件在求解动态规划问题时,通常需要给定一些初始的边界条件。

这些边界条件是问题求解的起点,通过这些边界条件可以向后递推求解问题的解。

边界条件的选取要根据问题的具体情况进行分析,确保问题能够得到正确的求解。

4. 递推求解在定义好状态、状态转移方程和边界条件后,就可以开始进行动态规划的求解了。

利用状态转移方程,从初始状态出发,逐步更新状态,直到求解出最终的结果。

在递推求解的过程中,通常需要使用一些辅助数据结构,如数组或矩阵,来保存中间结果。

5. 返回最优解在求解动态规划问题时,通常还需要返回最优解。

最优解是指问题的最优解决方案,它是通过求解过程中得到的状态选择得到的。

在求解过程中,可以使用一些辅助数组或矩阵来保存最优解的信息,以便最后返回最优解。

动态规划算法原理和实现

动态规划算法原理和实现

动态规划算法原理和实现动态规划是解决某些优化问题的一种算法思想,它主要针对的是那些可以分解成子问题的大问题,因此也被称作分治法。

动态规划算法的核心思想是将大问题分解成一个个小问题,然后逐步求解这些小问题并将它们组合成原问题的解。

本文将简单介绍动态规划算法的原理和实现。

一、动态规划算法的原理为了更好地理解动态规划算法的原理,我们可以以一个实例为例:假设有一个背包,它最多能装W重量的物品,现在有n种不同的物品,每种物品都有自己的重量w和价值v。

我们需要选择哪些物品放入背包中,以使得背包中物品的总价值最大。

这是一个典型的动态规划问题。

首先,我们可以把问题分解成子问题:设f(i,j)表示前i种物品放入一个容量为j的背包可以获得的最大价值。

因此,我们可以得到以下状态方程式:f(i,j) = max{f(i-1,j), f(i-1,j-w[i])+v[i]} (1≤i≤n,1≤j≤W)其中,f(i-1,j)表示不放第i种物品的最大价值,f(i-1,j-w[i])+v[i]表示放入第i种物品的最大价值。

因此,当我们计算出f(i,j)时,我们就得到了「前i种物品放入容量为j的背包的最大价值」,这也就是原问题的解。

这样,我们就可以使用动态规划算法来计算出最优解。

具体来说,我们从0开始,逐个计算出f(i,j)的值,直到计算出f(n,W)为止。

此外,我们还需要注意以下几点:1. 在计算f(i,j)的时候,我们需要使用到f(i-1,j)和f(i-1,j-w[i])这两个状态,因此我们需要先计算出f(1,j),在此基础上计算f(2,j),以此类推。

2. 对于一些特殊的情况,我们需要单独处理。

比如当背包容量小于某种物品重量时,我们就无法放入该物品。

3. 我们在计算f(i,j)时,有许多状态是可以复用的。

比如,当我们计算出f(i-1,j)后,我们就可以直接使用这个值来计算f(i,j),而无需重新计算。

二、动态规划算法的实现上面我们已经介绍了动态规划算法的核心思想和实现原理,下面我们来看看具体的实现过程。

动态规划算法的详细原理及使用案例

动态规划算法的详细原理及使用案例

动态规划算法的详细原理及使用案例一、引言动态规划是一种求解最优化问题的算法,它具有广泛的应用领域,如机器学习、图像处理、自然语言处理等。

本文将详细介绍动态规划算法的原理,并提供一些使用案例,以帮助读者理解和应用这一算法的具体过程。

二、动态规划的基本原理动态规划算法通过将问题分解为多个子问题,并利用已解决子问题的解来求解更大规模的问题。

其核心思想是利用存储技术来避免重复计算,从而大大提高计算效率。

具体来说,动态规划算法通常包含以下步骤:1. 定义子问题:将原问题分解为若干个子问题,这些子问题具有相同的结构,但规模更小。

这种分解可以通过递归的方式进行。

2. 定义状态:确定每个子问题的独立变量,即问题的状态。

状态具有明确的定义和可计算的表达式。

3. 确定状态转移方程:根据子问题之间的关系,建立状态之间的转移方程。

这个方程可以是简单的递推关系式、递归方程或其他形式的方程。

4. 解决问题:使用递推或其他方法,根据状态转移方程求解每个子问题,直到获得最终解。

三、动态规划的使用案例1. 背包问题背包问题是动态规划算法的经典案例之一。

假设有一个背包,它能容纳一定重量的物品,每个物品有对应的价值。

目的是在不超过背包总重量的前提下,选取最有价值的物品装入背包。

这个问题可以通过动态规划算法来求解。

具体步骤如下:(1)定义问题:在不超过背包容量的限制下,选取物品使得总价值最大化。

(2)定义状态:令dp[i][j]表示将前i个物品放入容量为j的背包中所能获得的最大价值。

(3)状态转移方程:dp[i][j] = max(dp[i-1][j-w[i]]+v[i], dp[i-1][j]),其中w[i]为第i个物品的重量,v[i]为第i个物品的价值。

(4)解决问题:根据状态转移方程依次计算每个子问题的解,并记录最优解,直到获得最终答案。

2. 最长公共子序列最长公共子序列(Longest Common Subsequence,简称LCS)是一种经典的动态规划问题,它用于确定两个字符串中最长的共同子序列。

动态规划的原理及应用

动态规划的原理及应用

动态规划的原理及应用1. 什么是动态规划动态规划(Dynamic Programming)是解决多阶段决策问题的一种优化方法。

它通过把原问题分解为相互重叠的子问题,并保存子问题的解,以避免重复计算,从而实现对问题的高效求解。

2. 动态规划的基本思想动态规划的基本思想可以归纳为以下几步:•确定问题的状态:将原问题分解为若干子问题,确定子问题的状态。

•定义状态转移方程:根据子问题的状态,确定子问题之间的关联关系,建立状态转移方程。

•确定初始条件和边界条件:确定子问题的初始状态和界限条件。

•计算最优解:采用递推或迭代的方式计算子问题的最优解。

•构造最优解:根据最优解的状态转移路径,构造原问题的最优解。

3. 动态规划的应用场景动态规划广泛应用于以下领域:3.1 图论在图论中,动态规划可以用来解决最短路径问题、最小生成树问题等。

通过保存子问题的最优解,可以避免重复计算,提高求解效率。

3.2 数值计算在数值计算中,动态规划可以用来解决线性规划、整数规划等问题。

通过将原问题分解为子问题,并利用子问题的最优解求解原问题,可以快速求解复杂的数值计算问题。

3.3 操作研究在操作研究中,动态规划可以用来解决最优调度问题、最优分配问题等。

通过将原问题拆分为若干子问题,并保存子问题的最优解,可以找到全局最优解。

3.4 自然语言处理在自然语言处理中,动态规划可以用来解决句法分析、语义理解等问题。

通过构建动态规划表,可以有效地解析复杂的自然语言结构。

3.5 人工智能在人工智能领域,动态规划可以用来解决机器学习、强化学习等问题。

通过利用动态规划的状态转移特性,可以训练出更加高效和智能的机器学习模型。

4. 动态规划的优势和限制动态规划的优势在于可以高效地解决复杂的多阶段决策问题,通过保存子问题的最优解,避免了重复计算,提高了求解效率。

同时,动态规划提供了一种清晰的问题分解和解决思路,可以帮助人们理解和解决复杂的问题。

然而,动态规划也有其应用的限制。

动态规划的基本概念与方法

动态规划的基本概念与方法

动态规划的基本概念与方法动态规划(Dynamic Programming,简称DP)是解决一类最优化问题的一种方法,也是算法设计中的重要思想。

动态规划常用于具有重叠子问题和最优子结构性质的问题。

它将问题分解为子问题,并通过求解子问题的最优解来得到原问题的最优解。

动态规划的基本概念是“最优子结构”。

也就是说,一个问题的最优解可以由其子问题的最优解推导出来。

通过分解问题为若干个子问题,可以形成一个递归的求解过程。

为了避免重复计算,动态规划使用一个表格来保存已经计算过的子问题的解,以便后续直接利用。

这个表格也被称为“记忆化表”或“DP表”。

动态规划的基本方法是“状态转移”。

状态转移指的是,通过已求解的子问题的解推导出更大规模子问题的解。

常用的状态转移方程可以通过问题的递推关系定义。

通过定义好状态转移方程,可以通过迭代的方式一步步求解问题的最优解。

在动态规划中,通常需要三个步骤来解决问题。

第一步,定义子问题。

将原问题划分为若干个子问题。

这些子问题通常与原问题具有相同的结构,只是规模更小。

例如,对于计算斐波那契数列的问题,可以定义子问题为计算第n个斐波那契数。

第二步,确定状态。

状态是求解问题所需要的所有变量的集合。

子问题的解需要用到的变量就是状态。

也就是说,状态是问题(解决方案)所需要的信息。

第三步,确定状态转移方程。

状态转移方程通过已求解的子问题的解推导出更大规模子问题的解。

通常情况下,状态转移方程可以通过问题的递推关系确定。

在实际应用中,动态规划常用于求解最优化问题。

最优化问题可以归纳为两类:一类是最大化问题,另一类是最小化问题。

例如,最长递增子序列问题是一个典型的最大化问题,而背包问题是一个典型的最小化问题。

动态规划的优势在于可以解决许多复杂问题,并且具有可行的计算复杂度。

但是,动态规划也有一些限制。

首先,动态规划要求问题具有重叠子问题和最优子结构性质,不是所有问题都能够满足这两个条件。

其次,动态规划需要存储计算过的子问题的解,对于一些问题来说,存储空间可能会非常大。

动态规划(完整)

动态规划(完整)

(3) 决策、决策变量
所谓决策就是确定系统过程发展的方案,
决策的实质是关于状态的选择,是决策者从
给定阶段状态出发对下一阶段状态作出的选
择。
用以描述决策变化的量称之决策变量, 和状态变量一样,决策变量可以用一个数, 一组数或一向量来描述.也可以是状态变量
的函数,记以 xk xk (sk ) ,表示于 k 阶段状
阶段变量描述当前所处的阶段位置,一 般用下标 k 表示;
(2) 确定状态
每阶段有若干状态(state), 表示某一阶段决策 面临的条件或所处位置及运动特征的量,称为 状态。反映状态变化的量叫作状态变量。 k 阶段的状态特征可用状态变量 sk 描述;
每一阶段的全部状态构成该阶段的状态集合Sk ,并有skSk。每个阶段的状态可分为初始状 态和终止状态,或称输入状态和输出状态, 阶段的初始状态记作sk ,终止状态记为sk+1 ,也是下个阶段的初始状态。
状态转移方程在大多数情况下可以由数学公 式表达, 如: sk+1 = sk + xk;
(6) 指标函数
用来衡量策略或子策略或决策的效果的 某种数量指标,就称为指标函数。它是定义 在全过程或各子过程或各阶段上的确定数量 函数。对不同问题,指标函数可以是诸如费 用、成本、产值、利润、产量、耗量、距离、 时间、效用,等等。
• 2、在全过程最短路径中,将会出现阶段的最优路
径;-----递推性
• 3、前面的终点确定,后面的路径也就确定了,且 与前面的路径(如何找到的这个终点)无关;----
-无后效性
• 3、逐段地求解最优路径,势必会找到一个全过程
最优路径。-----动态规划
§7.1多阶段决策问题
• 动态规划是解决多阶段最优决策的方法, 由美国数学家贝尔曼(R. Bellman) 于 1951年首先提出;

动态规划问题常见解法

动态规划问题常见解法

动态规划问题常见解法
动态规划是一种高效解决优化问题的方法。

它通常用于涉及最
优化问题和最短路径的计算中。

下面是一些常见的动态规划问题解法:
1. 背包问题
背包问题是动态规划中的经典问题之一。

其目标是在给定的背
包容量下,选择一些物品放入背包中,使得物品总价值最大。

解决
这个问题的常见方法是使用动态规划的思想,定义一个二维数组来
记录每个物品放入背包时的最大价值,然后逐步计算出最终的结果。

2. 最长公共子序列问题
最长公共子序列问题是寻找两个字符串中最长的公共子序列的
问题。

解决这个问题的常见方法是使用动态规划的思想,定义一个
二维数组来记录两个字符串中每个位置的最长公共子序列的长度。

然后通过递推关系来计算出最终的结果。

3. 矩阵链乘法问题
矩阵链乘法问题是计算一系列矩阵相乘的最佳顺序的问题。


决这个问题的常见方法是使用动态规划的思想,定义一个二维数组
来记录每个矩阵相乘时的最小乘法次数,然后逐步计算出最终的结果。

4. 最长递增子序列问题
最长递增子序列问题是寻找一个序列中最长的递增子序列的问题。

解决这个问题的常见方法是使用动态规划的思想,定义一个一
维数组来记录每个位置处的最长递增子序列的长度,然后通过递推
关系来计算出最终的结果。

以上是一些常见的动态规划问题解法。

通过灵活运用这些方法,我们可以更高效地解决优化问题和最短路径计算等相关任务。

《动态规划》课件

《动态规划》课件
《动态规划》ppt课 件
xx年xx月xx日
• 动态规划概述 • 动态规划的基本概念 • 动态规划的求解方法 • 动态规划的应用实例 • 动态规划的优化技巧 • 动态规划的总结与展望
目录
01
动态规划概述
定义与特点
定义
动态规划是一种通过将原问题分解为 相互重叠的子问题,并存储子问题的 解以避免重复计算的方法。
特点
动态规划适用于具有重叠子问题和最 优子结构的问题,通过将问题分解为 子问题,可以找到最优解。
动态规划的适用范围
最优化问题
01
动态规划适用于解决最优化问题,如最大/最小化问题、决策问
题等。
子问题重叠
02
动态规划适用于子问题重叠的情况,即子问题之间存在共享状
态或参数。
递归关系
03
动态规划适用于具有递归关系的问题,可以通过递归方式求解
机器调度问题
总结词
动态规划可以应用于机器调度问题,以确定最优的调度方案,满足生产需求并降低成本 。
详细描述
机器调度问题是一个经典的优化问题,涉及到如何分配任务到机器上,以最小化成本或 最大化效率。通过动态规划,可以将机器调度问题分解为一系列子问题,如确定每个任 务的调度顺序、分配机器等,并逐个求解子问题的最优解,最终得到整个调度方案的最
VS
详细描述
记忆化搜索法是一种优化技术,通过存储 已解决的子问题的解,避免重复计算,提 高求解效率。这种方法适用于子问题数量 较少且相互独立的情况。
04
动态规划的应用实例
最短路径问题
总结词
通过动态规划解决最短路径问题,可以找到 从起点到终点的最短路径。
详细描述
在图论中,最短路径问题是一个经典的优化 问题,旨在找到从起点到终点之间的一条路 径,使得路径上的所有边的权重之和最小。 动态规划是一种有效的解决方法,通过将问 题分解为子问题并存储子问题的解,避免了 重复计算,提高了求解效率。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

尼克的任务【动态规划】Time Limit:10000MS Memory Limit:65536KTotal Submit:3 Accepted:2Description尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成。

尼克的一个工作日为N分钟,从第一分钟开始到第N分钟结束。

当尼克到达单位后他就开始干活。

如果在同一时刻有多个任务需要完戍,尼克可以任选其中的一个来做,而其余的则由他的同事完成,反之如果只有一个任务,则该任务必需由尼克去完成,假如某些任务开始时刻尼克正在工作,则这些任务也由尼克的同事完成。

如果某任务于第P分钟开始,持续时间为T分钟,则该任务将在第P+T-1分钟结束。

写一个程序计算尼克应该如何选取任务,才能获得最大的空暇时间。

Input输入数据第一行含两个用空格隔开的整数N和K(1≤N≤10000,1≤K≤10000),N表示尼克的工作时间,单位为分钟,K表示任务总数。

接下来共有K行,每一行有两个用空格隔开的整数P和T,表示该任务从第P分钟开始,持续时间为T分钟,其中1≤P≤N,1≤P+T-1≤N。

Output输出文件仅一行,包含一个整数,表示尼克可能获得的最大空暇时间。

Sample Input15 61 21 64 118 58 111 5Sample Output4Hint【算法分析】题目给定的数据规模十分巨大:1≤K≤10000。

采用穷举方法显然是不合适的。

根据求最大的空暇时间这一解题要求,先将K个任务放在一边,以分钟为阶段,设置minute[i]表示从第i分钟开始到最后一分钟所能获得的最大空暇时间,决定该值的因素主要是从第i分钟起到第n分钟选取哪几个任务,与i分钟以前开始的任务无关。

由后往前逐一递推求各阶段的minute值:(1)初始值minute[n+1]=0(2)对于minute[i],在任务表中若找不到从第i分钟开始做的任务,则minute[i]比minute[i+1]多出一分钟的空暇时间;若任务表中有一个或多个从第i分钟开始的任务,这时,如何选定其中的一个任务去做,使所获空暇时间最大,是求解的关键。

下面我们举例说明。

设任务表中第i分钟开始的任务有下列3个:任务K1 P1=i T1=5任务K2 P2=i T2=8任务K3 P3=i T3=7而已经获得的后面的minute值如下:minute[i+5]=4,minute[i+8]=5,minute[i+7]=3若选任务K1,则从第i分钟到第i+1分钟无空暇。

这时从第i分钟开始能获得的空暇时间与第i+5分钟开始获得的空暇时间相同。

因为从第i分钟到i+5-1分钟这时段中在做任务K1,无空暇。

因此,minute[i]=minute[i+5]=4。

同样,若做任务K2,这时的minute[i]=minute[i+8]=5若做任务K3,这时的minute[i]=minute[1+7]=3显然选任务K2,所得的空暇时间最大。

因此,有下面的状态转移方程:其中,Tj表示从第i分钟开始的任务所持续的时间。

下面是题目所给样例的minute值的求解。

任务编号K 1 2 3 4 5 6开始时间P 1 1 4 8 8 11持续时间T 2 6 11 5 1 5时刻I 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1minute[i] 0 1 2 3 4 0 1 2 3 4 5 6 1 2 3 4选任务号k 0 0 0 0 0 6 0 0 4 0 0 0 3 0 0 2注:选任务号为该时刻开始做的任务之一,0表示无该时刻开始的任务。

问题所求得最后结果为从第1分钟开始到最后时刻所获最大的空暇时间minute[1]。

主要算法描述如下:(1)数据结构var p:array[1..10000]of integer; {任务开始时间}t:array[1..10000]of integer; {任务持续时间}minute:array[0..10001]of integer; {各阶段最大空暇时间} (2)数据读入①readln(n, k); {读入总的工作时间n及任务k}②读入k个任务信息for i:=1 to k do readln(p[i],t[i]); {假设任务的开始时间按有小到大排列}(3)递推求minute[i]j:=k; {从最后一个任务选起}for i:=n downto 1 dobeginminute[i]:=0;if p[i]<>i then minute[i]:=1+minute[i+1] {无任务可选}else while p[j]=i do {有从i分钟开始的任务}beginif minute[i+t[j]]>minute[i] then minute[i]:=minute[i+t[j]]; {求最大空暇时间}j:=j-1; {下一个任务}end;end;(4)输出解writeln(minute[1]);Source∙const maxn=10000;∙ maxk=10000;∙var∙ minute:array[1..maxn+1] of integer;∙ p:array[1..maxk] of integer;∙ t:array[1..maxn] of integer;∙ n,k,i,j:integer;∙begin∙ readln(n,k);∙ for i:=1 to k do readln(p[i],t[i]);∙ j:=k;∙ minute[n+1]:=0;∙ for i:=n downto 1 do begin∙ minute[i]:=0;∙ if p[j]<>i then minute[i]:=1+minute[i+1] ∙ else∙ while p[j]=i do begin∙ if minute[i+t[j]]>minute[i] then ∙ minute[i]:=minute[i+t[j]];∙ j:=j-1;∙ end;∙ end;∙ writeln(minute[1]);∙end.∙var∙ i,j,n,m,x,y:longint;∙ a,p,t:array[0..10000] of longint;∙ l:array[0..10001] of longint;∙begin∙ readln(n,m);∙ for i:=1 to m do read(p[i],t[i]);∙ l[n+1]:=0; j:=m;∙ for i:=n downto 1 do begin∙ l[i]:=0;∙ if i=p[j] then∙ while i=p[j] do begin∙ if l[i]<l[i+t[j]] then l[i]:=l[i+t[j]]; ∙ dec(j);∙ end∙ else l[i]:=l[i+1]+1;∙ end;∙ writeln(l[1]);∙end.书的复制【动态规划】Time Limit:10000MS Memory Limit:65536KTotal Submit:12 Accepted:6Description现在要把m本有顺序的书分给k给人复制(抄写),每一个人的抄写速度都一样,一本书不允许给两个(或以上)的人抄写,分给每一个人的书,必须是连续的,比如不能把第一、第三、第四本书给同一个人抄写。

现在请你设计一种方案,使得复制时间最短。

复制时间为抄写页数最多的人用去的时间。

Input第一行两个整数m,k;(k≤m≤500)第二行m个整数,第i个整数表示第i本书的页数。

Output共k行,每行两个整数,第i行表示第i个人抄写的书的起始编号和终止编号。

k行的起始编号应该从小到大排列,如果有多解,则尽可能让前面的人少抄写。

Sample Input9 31 2 3 4 5 6 7 8 9Sample Output1 56 78 9HintSource∙type rec=record∙ num,pos:longint;∙ end;∙var∙ m,k,i:longint;∙ bo:array[1..550] of longint;∙ data:array[1..550,0..550] of rec;∙procedure qiu(be,pe:longint);∙var i,t,tt,j,t2:longint;∙begin∙ if (pe=0) and (be<=m) then begin∙ data[be,pe].num:=maxlongint;∙ exit;∙ end else∙ if (pe=0) and (be>m) then begin∙ data[be,pe].num:=0;∙ exit;∙ end;∙ t:=0;∙ tt:=maxlongint;∙ for i:=be to m-pe+1 do begin∙ t:=t+bo[i];∙ if data[i+1,pe-1].num=0 then qiu(i+1,pe-1);∙ if data[i+1,pe-1].num>t then t2:=data[i+1,pe-1].num ∙ else t2:=t;∙ if t2<tt then begin∙ tt:=t2; j:=i;∙ end;∙ end;∙ data[be,pe].num:=tt;∙ data[be,pe].pos:=j;∙end;∙procedure print;∙var i,j:longint;∙begin∙ write(1,' ');∙ i:=1; j:=k;∙ while j>1 do begin∙ writeln(data[i,j].pos);∙ write(data[i,j].pos+1,' ');∙ i:=data[i,j].pos+1;∙ j:=j-1;∙ end;∙ writeln(m);∙begin∙ read(m,k);∙ if (m=k) and (m=0) then halt; ∙ for i:=1 to m do read(bo[i]); ∙ qiu(1,k);∙ print;∙end.∙∙ i,m,k,mm:longint;∙ a:array[0..500,0..500] of longint;∙ b:array[1..500] of longint;∙ c:array[0..500,0..500] of longint;∙ d:array[0..501,1..2] of longint;∙ f:text;∙procedure wry(o,k,m:longint);∙begin∙ if k<>1 then wry(o+1,k-1,c[k,m]);∙ d[o,1]:=c[k,m]+1; d[o,2]:=m;∙ if o>mm then mm:=o;∙end;∙∙procedure dry(l,r:longint);∙var i,j,t,max:longint;∙begin∙ t:=0;∙ for i:=r+1 to m-k+l do begin∙ t:=t+b[i]; max:=t;∙ if a[l-1,r]>max then max:=a[l-1,r];∙ if (a[l,i]=0) or (a[l,i]>max) then begin∙ a[l,i]:=max; c[l,i]:=r;∙ if l<>k then dry(l+1,i);∙ if (l=k) and (i=m) then wry(1,k,m);∙ end;∙ end;∙end;∙∙begin∙ readln(m,k);∙ for i:=1 to m do read(b[i]);∙ mm:=0;∙ if m<>0 then dry(1,0);∙ for i:=mm downto 1 do writeln(d[i,1],' ',d[i,2]); ∙end.∙。

相关文档
最新文档