动态规划经典教程
经典算法——动态规划教程

动态规划是对最优化问题的一种新的算法设计方法。
由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的没计法对不同的问题,有各具特色的表示方式。
不存在一种万能的动态规划算法。
但是可以通过对若干有代表性的问题的动态规划算法进行讨论,学会这一设计方法。
多阶段决策过程最优化问题——动态规划的基本模型在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。
因此各个阶段决策的选取不能任意确定,它依赖于当前面临的状态,又影响以后的发展。
当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线。
这种把一个问题看做是一个前后关联具有链状结构的多阶段过程就称为多阶段决策过程,这种问题称为多阶段决策最优化问题。
【例题1】最短路径问题。
图中给出了一个地图,地图中每个顶点代表一个城市,两个城市间的连线代表道路,连线上的数值代表道路的长度。
现在,想从城市A到达城市E,怎样走路程最短,最短路程的长度是多少?【分析】把从A到E的全过程分成四个阶段,用k表示阶段变量,第1阶段有一个初始状态A,两条可供选择的支路ABl、AB2;第2阶段有两个初始状态B1、 B2,B1有三条可供选择的支路,B2有两条可供选择的支路……。
用dk(x k,x k+1)表示在第k阶段由初始状态x k到下阶段的初始状态x k+1的路径距离,Fk(x k)表示从第k阶段的x k到终点E的最短距离,利用倒推方法求解A到E的最短距离。
具体计算过程如下:S1:K=4,有:F4(D1)=3,F4(D2)=4,F4(D3)=3S2: K=3,有:F3(C1)=min{d3(C1,D1)+F4(D1),d3(C1,D2)+F4(d2)}=min{8,10}=8F3(C2)=d3(C2,D1)+f4(D1)=5+3=8F3(C3)=d3(C3,D3)+f4(D3)=8+3=11F3(C4)=d3(C4,D3)+f4(D3)=3+3=6S2: K=2,有:F2(B1)=min{d2(B1,C1)+F3(C1),d2(B1,C2)+f3(C2),d2(B1,C3)+F3(C3)}=min {9,12,14}=9F2(m)=min{d2(B2,c2)+f3(C2),d2(B2,C4)+F3(C4)}=min{16,10}=10S4:k=1,有:F1(A)=min{d1(A,B1)+F2(B1),d1(A,B2)+F2(B2)}=min{13,13}=13因此由A点到E点的全过程的最短路径为A—>B2一>C4—>D3—>E。
动态规划算法教学PPT

03
动态规划算法的实现步骤
明确问题,建立数学模型
1
确定问题的目标和约束条件,将其转化为数学模 型。
2
理解问题的阶段划分,将问题分解为若干个子问 题。
3
确定状态变量和决策变量,以便描述子问题的状 态和决策。
划分阶段,确定状态变量和决策变量
01
根据问题的阶段划分,将问题分解为若干个子问题。
02
确定状态变量和决策变量,以便描述子问题的状态 和决策。
02
将子问题的最优解组合起来,得到原问题的最优解。
对最优解进行验证和性能评估,确保其满足问题的要求。
03
04
动态规划算法的优化技巧
分支定界法
分支定界法是一种求解优化问题的算 法,它通过不断生成问题的分支并确 定每个分支的界限,来寻找最优解。 在动态规划中,分支定界法可以用来 优化状态转移方程,减少计算量。
详细描述
多目标规划问题在实际生活中应用广泛,如资源分配、项目计划、城市规划等领 域都有涉及。常用的求解多目标规划的方法包括权重和法、帕累托最优解等。
多阶段决策问题
总结词
多阶段决策问题是动态规划中的一类,解决的问题需要在多个阶段做出决策,每个阶段的决策都会影响到后续阶 段的决策。
详细描述
多阶段决策问题在实际生活中应用广泛,如生产计划、库存管理、路径规划等领域都有涉及。常用的求解多阶段 决策问题的方法包括递归法、动态规划等。
特点
动态规划算法具有最优子结构、重叠 子问题和最优解性质等特征。
动态规划算法的应用领域
计算机科学
在计算机科学中,动态规划算法广泛应用于字符 串处理、排序、数据压缩和机器学习等领域。
电子工程
在电子工程中,动态规划算法用于信号处理、通 信和控制系统等领域。
动态规划实例讲解

x4 D 4(x4)x5 v4(x4,d4) v4(x4,d4)+f5(x5)f4(x4)最 优 决 策 d4*
D 1D 1 EE 5
5+0=5* 5 D 1 E
D 2D 2 EE 2
2+0=2* 2 D 2 E
16
求最短路径
其中*表示最优值,在上表中,由于决策允
许集合D4(x4)中的决策是唯一的,因此这个
从表达式f1(x1)可以看出,从A到E 的最短路径长度为19。由f1(x1)向 f4(x4)回朔,得到最短路径为:
A B2 C1D1E
23
24
资源分配问题
资源分配问题
例5.6: 有资金4万元,投资A、B、C三个项
目,每个项目的投资效益与投入该项目的
资金有关。三个项目A、B、C的投资效益
(万吨)和投入资金(万元)关系见下表:
x2 D 2(x2) x3 v2(x2,d2) v2(x2,d2)+f3(x3) f2(x2) d2*
000 0
0+0=0
00
1
0 1
1 0
0 13
0+11=11 13+0=13*
13 1
02 0
0+30=30*
2 1 1 13
13+11=24 30 0
2 0 29
29+0=29
03 0
0+45=45*
决策允许集合包含三个决策,它们是
D2(x2)=D2(B3)={B3C1,B3C2,B3C3}
15
求最短路径
最优指标函数fk(xk)表示从目前状态
到E的最短路径。终端条件为
f5(x5)=f5(E)=0 其含义是从E到E的最短路径为0。
动态规划(完整)

(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年首先提出;
《动态规划》课件

xx年xx月xx日
• 动态规划概述 • 动态规划的基本概念 • 动态规划的求解方法 • 动态规划的应用实例 • 动态规划的优化技巧 • 动态规划的总结与展望
目录
01
动态规划概述
定义与特点
定义
动态规划是一种通过将原问题分解为 相互重叠的子问题,并存储子问题的 解以避免重复计算的方法。
特点
动态规划适用于具有重叠子问题和最 优子结构的问题,通过将问题分解为 子问题,可以找到最优解。
动态规划的适用范围
最优化问题
01
动态规划适用于解决最优化问题,如最大/最小化问题、决策问
题等。
子问题重叠
02
动态规划适用于子问题重叠的情况,即子问题之间存在共享状
态或参数。
递归关系
03
动态规划适用于具有递归关系的问题,可以通过递归方式求解
机器调度问题
总结词
动态规划可以应用于机器调度问题,以确定最优的调度方案,满足生产需求并降低成本 。
详细描述
机器调度问题是一个经典的优化问题,涉及到如何分配任务到机器上,以最小化成本或 最大化效率。通过动态规划,可以将机器调度问题分解为一系列子问题,如确定每个任 务的调度顺序、分配机器等,并逐个求解子问题的最优解,最终得到整个调度方案的最
VS
详细描述
记忆化搜索法是一种优化技术,通过存储 已解决的子问题的解,避免重复计算,提 高求解效率。这种方法适用于子问题数量 较少且相互独立的情况。
04
动态规划的应用实例
最短路径问题
总结词
通过动态规划解决最短路径问题,可以找到 从起点到终点的最短路径。
详细描述
在图论中,最短路径问题是一个经典的优化 问题,旨在找到从起点到终点之间的一条路 径,使得路径上的所有边的权重之和最小。 动态规划是一种有效的解决方法,通过将问 题分解为子问题并存储子问题的解,避免了 重复计算,提高了求解效率。
第6章_动态规划ppt课件

gg(u1)
这时,机器的年完好率为a,即如果年初完好 机器的数量为u,到年终时完好的机器就为au, 0<a<1。在低负荷下进行生产时,产品的年 产量和投入生产的机器数量u2的关系为
hh(u2)
PPT学习交流
7
这时,机器的年完好率为b,0<b<1 。
假定开始生产时完好的机器数量为s,要求制定 一个五年计划,在每年开始时,决定如何重新分配 完好的机器在两种不同的负荷下生产的数量,使在 五年内产品的总产量达到最高?
PPT学习交流
15
2.在多阶段决策过程中,动态规划方法是既把前一 段和未来各段分开,又把当前效益和未来效益结 合起来考虑的一种最优化方法。因此,每段决策 的选取是从全局来考虑的,与该段的最优选择答 案一般是不同的。
3.在求整个问题的最优策略时,由于初始状态是已 知的,而每段的决策都是该段状态的函数,故最 优策略所经过的各段状态便可逐次变换得到,从 而确定了最优路线。
因f3是x3线性单调下降函数,故得最优解 x3*=0,相应的有f3(s3)=18s3
PPT学习交流
36
K=2时
f2(s2)0 m x 2 s2 [4 a x 2 x6 s2f3(s3) ]0 m x 2 s2(4 a x 2x 6 s2 1s3 8 ) 0 m x 2 s2 4 a x 2x 6 s2 1(5 4 8 s21 3x 0 2) 0 m x 2 s2(2 a5 2 0 x s27 5x 2)
sk1T k(sk,xk(sk))
PPT学习交流
12
PPT学习交流
13
PPT学习交流
14
§3 动态规划的基本方法
一、动态规划方法的基本原理
动态规划方法的基本思想:
动态规划基础讲解及经典案例分析解答ppt课件

#include <stdio.h> #include <memory.h> #define MAX_NUM 100 int D[MAX_NUM + 10][MAX_NUM + 10]; int N; int aMaxSum[MAX_NUM + 10][MAX_NUM + 10]; int MaxSum( int r, int j) {
细菌耐药与抗菌药物的合理应用施光 峰上海 复旦大 学人寿 保险基 本法宣 导部经 理基本 法课标 研教材 是集体 备课的 主要内 容是高 效课堂 的基础 高校基 建管理 相关法 规培训 七年级 生物下 册第七 章第一 节分析 人类活 动破坏 生态环 境的实 例期权 定价与 动态无 套利
4、参考程序 II
细菌耐药与抗菌药物的合理应用施光 峰上海 复旦大 学人寿 保险基 本法宣 导部经 理基本 法课标 研教材 是集体 备课的 主要内 容是高 效课堂 的基础 高校基 建管理 相关法 规培训 七年级 生物下 册第七 章第一 节分析 人类活 动破坏 生态环 境的实 例期权 定价与 动态无 套利
综合实践考核
第九课
return aMaxSum[r+1][j] +D[r][j]; return aMaxSum[r+1][j+1] + D[r][j]; }
细菌耐药与抗菌药物的合理应用施光 峰上海 复旦大 学人寿 保险基 本法宣 导部经 理基本 法课标 研教材 是集体 备课的 主要内 容是高 效课堂 的基础 高校基 建管理 相关法 规培训 七年级 生物下 册第七 章第一 节分析 人类活 动破坏 生态环 境的实 例期权 定价与 动态无 套利
3、参考程序 I
int scanf("%d", &N); for( int i = 1; i <= N; i ++ )
动态规划经典教程

动态规划经典教程第一节动态规划基本概念一,动态规划三要素:阶段,状态,决策。
他们的概念到处都是,我就不多说了,我只说说我对他们的理解:如果把动态规划的求解过程看成一个工厂的生产线,阶段就是生产某个商品的不同的环节,状态就是工件当前的形态,决策就是对工件的操作。
显然不同阶段是对产品的一个前面各个状态的小结,有一个个的小结构成了最终的整个生产线。
每个状态间又有关联(下一个状态是由上一个状态做了某个决策后产生的)。
下面举个例子:要生产一批雪糕,在这个过程中要分好多环节:购买牛奶,对牛奶提纯处理,放入工厂加工,加工后的商品要包装,包装后就去销售……,这样没个环节就可以看做是一个阶段;产品在不同的时候有不同的状态,刚开始时只是白白的牛奶,进入生产后做成了各种造型,从冷冻库拿出来后就变成雪糕(由液态变成固态=_=||)。
每个形态就是一个状态,那从液态变成固态经过了冰冻这一操作,这个操作就是一个决策。
一个状态经过一个决策变成了另外一个状态,这个过程就是状态转移,用来描述状态转移的方程就是状态转移方程。
经过这个例子相信大家对动态规划有所了解了吧。
下面在说说我对动态规划的另外一个理解:用图论知识理解动态规划:把动态规划中的状态抽象成一个点,在有直接关联的状态间连一条有向边,状态转移的代价就是边上的权。
这样就形成了一个有向无环图AOE网(为什么无环呢?往下看)。
对这个图进行拓扑排序,删除一个边后同时出现入度为0的状态在同一阶段。
这样对图求最优路径就是动态规划问题的求解。
二,动态规划的适用范围动态规划用于解决多阶段决策最优化问题,但是不是所有的最优化问题都可以用动态规划解答呢?一般在题目中出现求最优解的问题就要考虑动态规划了,但是否可以用还要满足两个条件:最优子结构(最优化原理)无后效性最优化原理在下面的最短路径问题中有详细的解答;什么是无后效性呢?就是说在状态i求解时用到状态j而状态j就解有用到状态k…..状态N。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
动态规划经典教程引言:本人在做过一些题目后对DP有些感想,就写了这个总结:第一节动态规划基本概念一,动态规划三要素:阶段,状态,决策。
他们的概念到处都是,我就不多说了,我只说说我对他们的理解:如果把动态规划的求解过程看成一个工厂的生产线,阶段就是生产某个商品的不同的环节,状态就是工件当前的形态,决策就是对工件的操作。
显然不同阶段是对产品的一个前面各个状态的小结,有一个个的小结构成了最终的整个生产线。
每个状态间又有关联(下一个状态是由上一个状态做了某个决策后产生的)。
下面举个例子:要生产一批雪糕,在这个过程中要分好多环节:购买牛奶,对牛奶提纯处理,放入工厂加工,加工后的商品要包装,包装后就去销售……,这样没个环节就可以看做是一个阶段;产品在不同的时候有不同的状态,刚开始时只是白白的牛奶,进入生产后做成了各种造型,从冷冻库拿出来后就变成雪糕(由液态变成固态=_=||)。
每个形态就是一个状态,那从液态变成固态经过了冰冻这一操作,这个操作就是一个决策。
一个状态经过一个决策变成了另外一个状态,这个过程就是状态转移,用来描述状态转移的方程就是状态转移方程。
经过这个例子相信大家对动态规划有所了解了吧。
下面在说说我对动态规划的另外一个理解:用图论知识理解动态规划:把动态规划中的状态抽象成一个点,在有直接关联的状态间连一条有向边,状态转移的代价就是边上的权。
这样就形成了一个有向无环图AOE网(为什么无环呢?往下看)。
对这个图进行拓扑排序,删除一个边后同时出现入度为0的状态在同一阶段。
这样对图求最优路径就是动态规划问题的求解。
二,动态规划的适用范围动态规划用于解决多阶段决策最优化问题,但是不是所有的最优化问题都可以用动态规划解答呢?一般在题目中出现求最优解的问题就要考虑动态规划了,但是否可以用还要满足两个条件:最优子结构(最优化原理)无后效性最优化原理在下面的最短路径问题中有详细的解答;什么是无后效性呢?就是说在状态i求解时用到状态j而状态j就解有用到状态k…..状态N。
而求状态N时有用到了状态i这样求解状态的过程形成了环就没法用动态规划解答了,这也是上面用图论理解动态规划中形成的图无环的原因。
也就是说当前状态是前面状态的完美总结,现在与过去无关。
当然,有是换一个划分状态或阶段的方法就满足无后效性了,这样的问题仍然可以用动态规划解。
三,动态规划解决问题的一般思路。
拿到多阶段决策最优化问题后,第一步要判断这个问题是否可以用动态规划解决,如果不能就要考虑搜索或贪心了。
当却定问题可以用动态规划后,就要用下面介绍的方法解决问题了:(1)模型匹配法:最先考虑的就是这个方法了。
挖掘问题的本质,如果发现问题是自己熟悉的某个基本的模型,就直接套用,但要小心其中的一些小的变动,现在考题办都是基本模型的变形套用时要小心条件,三思而后行。
这些基本模型在先面的分类中将一一介绍。
(2)三要素法仔细分析问题尝试着确定动态规划的三要素,不同问题的却定方向不同:先确定阶段的问题:数塔问题,和走路问题(详见解题报告)先确定状态的问题:大多数都是先确定状态的。
先确定决策的问题:背包问题。
(详见解题报告)一般都是先从比较明显的地方入手,至于怎么知道哪个明显就是经验问题了,多做题就会发现。
(3)寻找规律法:这个方法很简单,耐心推几组数据后,看他们的规律,总结规律间的共性,有点贪心的意思。
(4)边界条件法找到问题的边界条件,然后考虑边界条件与它的领接状态之间的关系。
这个方法也很起效。
(5)放宽约束和增加约束这个思想是在陈启锋的论文里看到的,具体内容就是给问题增加一些条件或删除一些条件使问题变的清晰。
第二节动态规划分类讨论这里用状态维数对动态规划进行了分类:1.状态是一维的1.1下降/非降子序列问题:问题描述:{挖掘题目的本质,一但抽象成这样的描述就可以用这个方法解}在一个无序的序列a1,a2,a3,a4…an里,找到一个最长的序列满足:ai<=aj<=ak…<=am,且i<j<k…<m.(最长非降子序列)或ai>aj>ak…>am,且i>j>k…>m.(最长下降子序列)。
问题分析:如果前i-1个数中用到ak (ak>ai或ak<=ai)构成了一个的最长的序列加上第I个数ai就是前i个数中用到i的最长的序列了。
那么求用到ak构成的最长的序列有要求前k-1个数中……从上面的分析可以看出这样划分问题满足最优子结构,那满足无后效性么?显然对于第i个数时只考虑前i-1个数,显然满足无后效性,可以用动态规划解。
分析到这里动态规划的三要素就不难得出了:如果按照序列编号划分阶段,设计一个状态opt[i] 表示前i个数中用到第i个数所构成的最优解。
那么决策就是在前i-1个状态中找到最大的opt[j]使得aj>ai(或aj<=ai),opt[j]+1就是opt[i]的值;用方程表示为:{我习惯了这种写法,但不是状态转移方程的标准写法} opt[i]=max(opt[j])+1 (0<=j<i 且aj<=ai) {最长非降子序列}opt[i]=max(opt[j])+1 (0<=j<i 且aj>ai) {最长下降子序列}实现求解的部分代码:opt[0]:=maxsize;{maxsize 为maxlongint或-maxlongint}for i:=1 to n dofor j:=0 to i-1 doif ( a[j]>a[i]) and (opt[j]+1>opt[i]) thenopt[i]:=opt[j]+1;ans:=-maxlongint;for i:=1 to n doif opt[i]>ans then ans:=opt[i]; {ans 为最终解}复杂度:从上面的实现不难看出时间复杂度为O(N2),空间复杂度O(N);例题1 拦截导弹(missile.pas/c/cpp) 来源:NOIP1999(提高组) 第一题【问题描述】某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。
但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。
某天,雷达捕捉到敌国的导弹来袭。
由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
【输入文件】missile.in单独一行列出导弹依次飞来的高度。
【输出文件】missile.out两行,分别是最多能拦截的导弹数,要拦截所有导弹最少要配备的系统数【输入样例】389 207 155 300 299 170 158 65【输出样例】62【问题分析】有经验的选手不难看出这是一个求最长非升子序列问题,显然标准算法是动态规划。
以导弹依次飞来的顺序为阶段,设计状态opt[i]表示前i个导弹中拦截了导弹i可以拦截最多能拦截到的导弹的个数。
状态转移方程:opt[i]=max(opt[j])+1 (h[i]>=h[j],0=<j<i) {h[i]存,第i个导弹的高度}最大的opt[i]就是最终的解。
这只解决了第一问,对于第二问最直观的方法就是求完一次opt[i]后把刚才要打的导弹去掉,在求一次opt[i]直到打完所有的导弹,但这样做就错了。
不难举出反例: 6 1 7 3 2错解: 6 3 2/1/7 正解:6 1/7 3 2其实认真分析一下题就回发现:每一个导弹最终的结果都是要被打的,如果它后面有一个比它高的导弹,那打它的这个装置无论如何也不能打那个导弹了,经过这么一分析,这个问题便抽象成在已知序列里找最长上升序列的问题。
求最长上升序列和上面说的求最长非升序列是一样的,这里就不多说了。
复杂度:时间复杂度为O(N2),空间复杂度为O(N)。
【源代码】program missile;constfin='missile.in';fout='missile.out';maxn=10000;vara,opt:array[0..maxn] of longint;n,anslen,anstime:longint;procedure init;varx:longint;beginassign(input,fin);reset(input);assign(output,fout);rewrite(output);n:=0;repeatinc(n);read(a[n]);until seekeof;end;procedure main;vari,j:longint;beginfillchar(opt,sizeof(opt),0);a[0]:=maxlongint;for i:=1 to n dofor j:=i-1 downto 0 doif (a[j]>=a[i]) and(opt[j]+1>opt[i]) thenopt[i]:=opt[j]+1;anslen:=0;for i:=1 to n doif opt[i]>anslen thenanslen:=opt[i];fillchar(opt,sizeof(opt),0);a[0]:=-maxlongint;for i:=1 to n dofor j:=i-1 downto 0 doif (a[j]<a[i]) and(opt[j]+1>opt[i]) thenopt[i]:=opt[j]+1;anstime:=0;for i:=1 to n doif opt[i]>anstime thenanstime:=opt[i];end;procedure print;beginwriteln(anslen);writeln(anstime);close(input);close(output);end;begininit;main;print;end.例题二合唱队形(chorus.pas/c/cpp) 来源:NOIP2004(提高组) 第一题N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK,则他们的身高满足T1<...<Ti>Ti+1>…>TK(1<=i<=K)。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。