动态规划算法作业.pdf
动态规划.pdf

第三章:动态规划3.1 动态规划的基本概念一、动态决策问题:决策过程具有阶段性和时序性(与时间有关)的决策问题。
即决策过程可划分为明显的阶段。
二、什么叫动态规划(D.P.–Dynamic Program):多阶段决策问题最优化的一种方法。
广泛应用于工业技术、生产管理、企业管理、经济、军事等领域。
三、动态规划(D.P.)的起源:1951年,(美)数学家R.Bellman等提出最优化原理,从而建立动态规划,名著《动态规划》于1957年出版。
四、动态决策问题分类:1、按数据给出的形式分为:•离散型动态决策问题。
•连续型动态决策问题。
2、按决策过程演变的性质分为:•确定型动态决策问题。
•随机型动态决策问题。
五1、阶段(stage)n :作出决策的若干轮次。
n = 1、2、3、4、5。
2、状态(state)S n :每一阶段的出发位置。
构成状态集,记为S nS 1={A},S 2={B 1,B 2,B 3},S 3={C 1,C 2,C 3},S 4={D 1,D 2,D 3},S 5={E 1,E 2}。
阶段的起点。
3、决策(decision)X n :从一个阶段某状态演变到下一个阶段某状态的选择。
构成决策集,记为D n (S n )。
阶段的终点。
D 1(S 1)={X 1(A)}={B 1,B 2,B 3}= S 2,D 2(S 2)={X 2(B 1),X 2(B 2),X 2(B 3)}={C 1,C 2,C 3}=S 3,D 3(S 3)={X 3(C 1),X 3(C 2),X 3(C 3)}={D 1,D 2,D 3}=S 4,D 4(S 4)={X 4(D 1),X 4(D 2),X 4(D 3)}={E 1,E 2}=S 5D 5(S 5)={X 5(E 1),X 5(E 2)}={F;F}={F}。
4、策略(policy):全过程中各个阶段的决策Xn 组成的有序总体{Xn }。
如 A àB2àC1àD1àE2àF5、子策略(sub-policy):剩下的n个阶段构成n子过程,相应的决策系列叫n子策略。
动态规划

算法一:递归的思想 设两个字符串分别是 char str1[MAXL]; 长度是len1 char str2[MAXL]; 长度是len2 设f(str1,len1,str2,len2)为str1和str2的最大 公共子串的长度,则可以对两个字符 串的最后一个字符的情况进行枚举: 情况一:str1[len1-1] == str2[len1-1],则
动 态 规 划
例10 POJ 1458最大公共子串 给出两个字符串,求出这样的一个 最长的公共子序列的长度:子序列 中的每个字符都能在两个原串中找 到,而且每个字符的先后顺序和原 串中的先后顺序一致。 Sample Input abcfbc abfcab programming contest abcd mnp Sample Output 4 2 0
return 1+MaxStr(str1,len1-1,str2,len2-1);
else if(MaxStr(str1,len1-1, str2,len2)>MaxStr(str1,len1,str2,len2-1)) return MaxStr(str1,len1-1,str2,len2); else return MaxStr(str1,len1,str2,len2-1);
程序如下:
#include "stdio.h" #include "memory.h" #include "string.h" char str1[100]; char str2[100]; int MaxStr(char *s,int len1,char *t,int len2) { if(len1==0||len2==0) return 0; else if(str1[len1-1] == str2[len2-1])
动态规划练习例题

动态规划方法总结
动态规划算法的设计步骤
– – – – – – – 将问题表示成多步判断 确定是否满足优化原则——必要条件 确定子问题的重叠性——估计算法效率 列出关于优化函数的递推方程(或不等式)和边界条件 自底向上计算子问题的优化函数值----非递归的算法 备忘录方法记录中间结果 标记函数追踪问题的解
• S(i)表示结束于位置i的最大子区间和 • max{S(i)}即为所求最大子区间和 • 考虑如何递推求解并反算问题解
最大子矩阵
• 已知矩阵的大小定义为矩阵中所有元素的 和。给定一个矩阵,找到最大的非空(大小 至少是1 * 1)子矩阵。 • 例如这个矩阵的最大子矩阵大小为15。
0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2
动态规划练习例题在棋盘上移动在一个nn的棋盘上棋子可以向上方右上方或左上方移动每次从x方格移动到y方格将获得pxy元钱pxy不一定是正数现求一个获得钱最多的从底边到顶边的一种移动棋子的方案
动态规划练习例题
在棋盘上移动
• 在一个n×n的棋盘上,棋子可以向上方、 右上方或左上方移动,每次从x方格移动到y 方格将获得p(x,y)元钱, p(x,y)不一定是正 数,现求一个获得钱最多的从底边到顶边 的一种移动棋子的方案。
解题思路
Qx, y 1 Q x, y max Qx 1, y 1 Q x 1, y 1 y 1 px, y 1, x, y y 1 px 1, y 1, x, y y 1且x 1 px 1, y 1, x, y y 1且x 字符串X=x1,x2,…xm和Y=y1,y2,…yn 使用一系列编辑操作将字符串X转变成Y。允许使 用插入,删除,修改三种操作,每种操作都有 一定的代价,求一个总代价最小的操作序列。 – 设从字符X中删除符号xi的代价为D(xi) – 将符号yj插入X的代价为I(yj) – 将X中的符号xi修改成yj的代价为C(xi,yj)
《算法设计与分析》第3章 动态规划法

最优解的递推关系 定义m[i:j],表示矩阵连乘A[i:j]所需的最少计算 量 则有: i j 0 m[i ][ j ] i j minj{m[i ][ k ] m[k 1][ j ] pi 1 pk p j } i k
假设:N个矩阵的维数依序放在一维数组p中, 其中Ai的维数记为Pi-1×Pi
A=A1×A2×A3×…×An
A=(A1×A2×…×Ak) × (Ak+1×Ak+2×…×An)
B
C
1.2 穷举法
穷举法:列举出所有可能的计算次序,并计算出 每一种计算次序相应需要的数乘次数,从中找出 一种数乘次数最少的计算次序。
穷举法复杂度分析: 对于n个矩阵的连乘积,设其不同的计算次序有P(n)种。 由于每种加括号方式都可以分解为两个子连乘的加括号问题: (A1...Ak)(Ak+1…An)可以得到关于P(n)的递推式如下:
【程序】矩阵连乘的 穷举法实现 int MatrixChain::LookupChain(int i, int j) { if(i==j) return 0; int u=LookupChain(i+1,j)+p[i-1]*p[i]*p[j]; //k=i s[i][j]=i; //记录最优分解位置 for ( int k=i+1;k<j; k++ ) { //遍历k int t=LookupChain(i,k)+LookupChain(k+1,j) +p[i]*p[k+1]*p[j+1]; if (t<u) { u=t; s[i][j]=k; //记录最优分解位置 } } int MatrixChain::LookupChain() return u; { } return LookupChain(1,n);
最新2000信管动态规划作业

fk(Sk)=max{gk(xk)+fk+1(Sk+1)} k=3,2,1
0≤akxk≤Sk
f4(s4)=0
k=3时 f3(s3)=max{2x32}
0≤3x3≤s3
显然当x3*=s3/3时取得最大值2/9x32
运筹学作业
则f3(s3)=max{2x32}=2s32 0≤3x3≤s3 当k=2时 f2(s2)=max{9x2+f3(s3)} 0≤4x2≤s3 =max{9x2+2/9(s2-4x2)2} 0≤4x2≤s3
因为f2(0)=2/9s22 ;f2(s2/4)=9/4s2
当 f2(0)= f2(s2/4) 时 有 2 / 9 s22=9/4s2 则 s2=81/8>10
有s2必小于81/8
所以f2(0)<f2(s2/4) 則x2*=s2/4
k=1时 f1(s1)=max{4x1+f2(s2)}
0≤2x1≤s1
x3*=s3=s1=9 则maxz=174
(到第
3个项目的资金额,决策变量xk为决定投给 第K个项目的资金额;状态转移方程为 sk+1=sk-xk;最优指标函数 fk(sk)表示第K阶 段,初始状态为sk时,从第K到第三个项目 所获最大收益,f1(s1)即为所求的总收益。递 推方程为:
益为90/4.
结束语
谢谢大家聆听!!!
18
2000信管动态规划作业
(3)
MaxZ=4x12-x22+2x32+12 3x1+2x2+x3=9
xi≥0 (i=1,2,3) 解:利用动态规划求解。 用逆序解法:设状态转移方程为:Sk+1=Sk-
floyd算法例题 a1 a2 a3 a4

Floyd算法是一种用来寻找图中所有节点对之间最短路径的算法,它的核心思想是动态规划。
Floyd算法的基本原理是:假设图中有n个节点,将所有节点对之间的最短路径长度初始化为它们之间的直接连线长度,然后逐步更新这些距离,直到得到所有节点对之间的最短路径。
在本文中,我们将通过四个例题a1、a2、a3、a4来讲解Floyd算法的具体应用,以帮助读者更好地理解和掌握这一算法。
1. 例题a1【题目】有一个带权有向图,节点数为n,边数为m,求图中任意两点之间的最短路径长度。
【输入】第一行为两个整数n和m,分别表示节点数和边数。
接下来m行,每行包含三个整数a、b、c,表示图中存在一条从节点a到节点b的有向边,边的权值为c。
【输出】输出一个n×n的矩阵,其中第i行第j列的元素表示节点i到节点j的最短路径长度。
如果两点之间不存在路径,则输出一个特定的值(例如9999)。
【样例】输入:5 71 2 21 3 32 3 22 4 53 4 13 5 64 5 3输出:0 2 3 7 99999 0 2 5 89999 9999 0 3 69999 9999 9999 0 39999 9999 9999 9999 0【分析】根据给定的图和节点数,首先初始化一个n×n的矩阵,然后将直接连线的路径长度填入矩阵中。
接下来,利用Floyd算法逐步更新矩阵中的最短路径长度,直到得到所有节点对之间的最短路径长度。
2. 例题a2【题目】有一个带权有向图,节点数为n,边数为m,求图中是否存在负权环。
【输入】第一行为两个整数n和m,分别表示节点数和边数。
接下来m行,每行包含三个整数a、b、c,表示图中存在一条从节点a到节点b的有向边,边的权值为c。
【输出】若存在负权环,则输出"存在负权环",否则输出"不存在负权环"。
【样例】输入:3 31 2 -12 3 -23 1 -3输出:存在负权环【分析】我们可以利用Floyd算法求出图中任意两点之间的最短路径长度,然后再验证是否存在负权环。
动态规划习题完整版

动态规划习题Document serial number【NL89WT-NY98YT-NC8CB-NNUUT-NUT108】动态规划专题分类视图数轴动规题:题1.2001年普及组第4题--装箱问题【问题描述】有一个箱子容量为V(正整数,0≤V≤20000),同时有n个物品(0<n≤30),每个物品有一个体积(正整数)。
要求从n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
【输入格式】输入文件box.in有若干行。
第一行:一个整数,表示箱子容量V;第二行:一个整数,表示物品个数n;接下来n行,分别表示这n个物品的各自体积。
【输出格式】输出文件box.out只有一行数据,该行只有一个数,表示最小的箱子剩余空间。
【输入样例】2468312797【输出样例】题2.1996年提高组第4题--砝码秤重__数据加强版【问题描述】设有n种砝码,第k种砝码有Ck 个,每个重量均为Wk,求:用这些砝码能秤出的不同重量的个数,但不包括一个砝码也不用的情况。
【输入格式】输入文件weight.in的第一行只有一个数n,表示不同的砝码的种类数.第2行至第n+1行,每行有两个整数.第k+1行的两个数分别表示第k种砝码的个数和重量.【输出格式】输出文件weight.out中只有一行数据:Total=N。
表示用这些砝码能秤出的不同重量数。
【输入样例】22223【输出样例】Total=8【样例说明】重量2,3,4,5,6,7,8,10都能秤得【数据限制】对于100%的数据,砝码的种类n满足:1≤n≤100;对于30%的数据,砝码的总数量C满足:1≤C≤20;对于100%的数据,砝码的总数量C满足:1≤C≤100;对于所有的数据,砝码的总重量W满足:1≤W≤400000;题3.石子归并-szgb.pas【问题描述】有一堆石头质量分别为W1,W2,…,Wn.(Wi≤10000),将石头合并为两堆,使两堆质量的差最小。
【输入】输入文件szgb.in的第一行只有一个整数n(1≤n≤50),表示有n堆石子。
算法设计与分析-动态规划习题

a
j
k
T(n)=2T(n/2)+O(n) 解此递归方程可知,T(n)=O(nlogn) 3) 记 b[j]=
a
k 1
j
k
,1≤i≤n,则所求的最大子段和问题为
a
k 1
j
k
=max max
a
k i
j
k
=max b[j]
由 b[j]的定义可知,b[j-1]>0 时,b[j]= b[j-1]+a[j], 否则 b[j]=a[j],因此 b[j]的动态规划递 归式 b[j]=max{b[j-1]+a[j],a[j]},1≤j≤n。 据此, 可设计出最大子段和动态规划算法如下: int MaxSum(int n,int *a) { Int sum=0,b=0; For(int i=1;i<=n;i++){ If(b>0)b+=a[j]; Else b=a[j]; If(b>sum)sum=b; } Return sum; } 显然,这个算法需要的时间和空间复杂度均为 O(n)。
则 RELI(1,n,c)可靠性设计的最优值为:
初始条件:f0 (X)=1,0≤X≤c
i
S ={ (f , X ) | f =f (X ) }
i i
S ={ (f , X ) | f =f (X ) }为可靠性设计问题 RELI(1,i,X) 的最优解,(f, X)是由 m1 ,m2 ,…,mi 的
按此递归式计算出来的 m(n,b)为最优值,算法所需的计算时间为 O(nb)。
4、可靠性设计:一个系统由 n 级设备串联而成,为了增强 可靠性,每级都可能并联了不止一台同样的设备。假设第 i 级设备 Di 用了 mi 台,该级设备的可靠性是 gi(mi),则这个 系统的可靠性是Π gi(mi)。一般来说 gi(mi)都是递增函数,所 以每级用的设备越多系统的可靠性越高。但是设备都是有成 本的, 假定设备 Di 的成本是 ci, 设计该系统允许的投资不超 过 c,那么,该如何设计该系统(即各级采用多少设备)使 得这个系统的可靠性最高。试设计一个动态规划算法求解可 靠性设计。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 n←length(T)2 create array x[1:L]3 for j←1 to L4 d o x[j]←j/T[1]5 for i←2 to n6 do for j←L to 17 do for k←1 to j/T[i]8 do if x[j-k*x]+k<x[j]9 then x[j]←x[j-k*x]+k10 return x时间复杂度分析:算法1~2行时间复杂度为O(1),3~4行时间复杂度为O(L),5~9行时间复杂度为O(nL2),10行时间复杂度为O(1)。
故算法总的时间复杂度为O(nL2)。
(3)设y[1:n]存储当找钱数为j的最优解时T[1:n]硬币分别找的个数。
选择面值最大的T[i],1≤i≤n,使C[n,j]=C[n,j-T[i]]+1,则子问题找钱数为j-T[i]的最优解y’[1:n]中,y’[i]+1后即为原问题的最优解y[1:n]。
故问题的最优解可以通过子问题的最优解来达到,该问题具有贪心选择性。
(假设T[1:n]的面值是递增的,并且C[n,L]是与排序后的T对应的结果)Input:T[1:n], C[1:L], mOutput:每个硬币对应的数目y[1:n]GET-CHANGE-NUMBER(T,C,m)1 n←length(T),w←m2 create array y[1:n]3 for i←1 to n4 do y[i]←05 while w>06 do for i←n to 17 do if C[w]=C[w-T[i]]+18 then y[i]←y[i]+19 w←w-T[i]10 break11 return y时间复杂性分析:算法1~2行时间复杂度为O(1),2~3行时间复杂度为O(n),5~10行时间复杂度为O(m×n),11行时间复杂度为O(1)。
故算法总的时间复杂度为O(m×n)。
2.设计一个动态规划算法从n个数构成的数列中找出最长单调递增子序列。
答:(1)问题转化:设X[1:n]为n个数构成的序列,Y[1:n]为将X[1:n]中的数进行递增排序的结果。
那么,原问题可以转化为求X和Y的最长公共子序列。
设X中的最长单调递增子序列为x i, x j, …, x k, x m,那么在排序后的Y中,该子序列仍以这一顺序存在于Y中,显然该序列为X和Y的公共子序列。
假设其不是X和Y的最长公共子序列,设其最长公共子序列为x i, x j, …, x p, …, x k, x m。
由于Y为递增序列,因此有x i<x j<…<x p<…<x k<x m。
又因为x i, x j, …, x p, …, x k, x m是X的子序列,那么在X序列中,有一个更长的单调递增子序列x i, x j, …, x p, …, x k, x m。
产生了矛盾,因此X的最长单调递增子序列即为X和Y的最长公共子序列。
(2)优化子结构X和Y的LCS=(z1,z2,…,z k)的优化解结构为LCS XY=LCS X+<x m=y n> if x m=y nm−1Y n−1if x m≠y n,z k≠x mLCS XY=LCS Xm−1Yif x m≠y n,z k≠y mLCS XY=LCS XYn−1(3)递推方程C[i,j]=X i和Y j的LCS的长度C[i,j]=0 if i=0或j=0C[i,j]=C[i−1,j−1]+1 if i,j>0且x i=y jC[i,j]=max (C[i,j−1],C[i−1,j]) if i,j>0且x i=y j (4)算法伪代码Input:数列X[1:n]Output:X的最长单调递增子序列LIS(X)1 n←length(X)2 create array Y[1:n] ,C[n,n] and B[n,n]3 Y←sort(X)4 for i←1 to n5 do C[i,0]←0,C[0,j]←06 for i←1 to n7 do for j←1 to n8 if X[i]=Y[j]9 then C[i,j]←C[i-1,j-1]+1;B[i,j]←“↖”10 else if C[i-1,j]≥C[i,j-1]11 then C[i,j]←C[i-1,j]; B[i,j]←“↑”12 else C[i,j]←C[i,j-1]; B[i,j]←“←”13 return B and CPRINT-LIS(B,X,i,j)1 if i←0 or j←02 then return3 if B[i,j]= “↖”4 then PRINT-LIS(B,X,i-1,j-1);print X[i]5 else if B[i,j]= “↑”6 then PRINT-LIS(B,X,i-1,j);7 else PRINT-LIS(B,X,i,j-1);时间复杂度分析:计算代价算法LIS(X)中,1~2行时间复杂度为O(1),3行为排序算法,时间复杂度最低为O(nlogn),4~5行时间复杂度为O(n),6~12行时间复杂度为O(n2),13行时间复杂度为O(1);构造算法PRINT-LIS(B,X,i,j)中,时间复杂度为O(2n)。
故算法总的时间复杂度为O(n 2)。
3.给定一个n×n 的矩阵A ,矩阵中的元素只取0或者1。
设计一个动态规划算法,求解得到A 中元素全是1的子方阵使其阶数达到最大值。
答:(1)优化子结构:设n 阶矩阵表示为A[1:n,1:n],B[i,j]为A 中前i 行,前j 列中1的个数。
则⎩⎨⎧==++=1A[i][j] if 10A[i][j] if 0B -B B B 1-j 1,-i 1-j i,j 1,-i j i, 如果B i,j -B i-k,j - B i,j-k +B i-k,j-k =k 2,那么在该位置存在一个k 阶矩阵。
(2)递推方程:设C[i,j]表示A 中前i 行前j 列中元素全为1的子方阵的最大阶数。
则递推方程为:C [i,j ]=max {C [i −1,j ],C [i,j −1],max k{k ≥max (C [i −1,j ],C [i,j −1])| B [i,j ]−B [i −k,j ]−B [i,j −k ]+B [i −k ][j −k ]=k ×k}}(3)算法伪代码只要知道了C n,n 的值,就知道了最优解的阶数,为了知道这个最优解的具体信息,我们还需一个结构S ,S i,j 是C i,j 对应的方阵的右下角元素在A 中对应的位置。
因此,S n,n 就是最优解方阵右下角元素的位置,C n,n 是最优解的阶数。
GET-MAX-MATRIX(A,n)1 create arrays B[0:n][0:n],C[0:n][0:n],S[1:n][1:n]2 for i←0 to n3 do B[i][0]←0; B[0][i]←0;C[i][0]← 0; C[0][i]←0;4 for i←0 to n5 do for j←0 to n6 do if A[i][j]=17 then B[i][j]←18 else B[i][j]←09 B[i][j]←B[i][j]+B[i-1][j]+B[i][j-1]+B[i-1][j-1]10if C[i-1][j]>C[i][j-1]11 then C[i][j]←C[i-1][j]12 S[i][j]←C[i-1][j]13 else C[i][j]←C[i][j-1]14 S[i][j]←C[i][j-1]15 for k←C[i][j]+1 to i16 do if i-k+1<1 or j-k+1<017 then break18 if B[i][j]-B[i-k+1][j]-B[i][j-k]+B[i-k][j-k]=k×k19 then C[i][j]←k20 S[i][j] (i,j)21 else break22 return S and C算法结束后,S[n][n]中有序实数对(i,j)为A 中最大全1矩阵右下角元素的坐标。
该矩阵为A[i-C[n][n]:i][j-C[n][n]:j]。
时间复杂度分析:算法第1行时间复杂度为O(1),2~3行时间复杂度为O(n),4~22行时间复杂度为O(n 3),23行时间复杂度为O(1)。
故算法总的时间复杂度为O(n 3)。
4.集合划分问题描述如下:输入:正整数集合 S={a 1,a 2,a 3,…, a n };输出:是否存在A ⊆ S 使得∑a i =∑a i a i ∈S−A a i ∈A 。
试设计一个动态规划算法,求解集合划分问题。
答:(1)问题转化:若集合划分A 使得∑a i =∑a i a i ∈S−A a i ∈A ,则有∑a i =∑a i =12∑a i a i ∈S a i ∈S−A a i ∈A 。
那么,该问题可转化为一个0-1背包问题。
对于输入的正整数集合S={a 1,a 2,a 3,…, a n }。
设X=(x 1, x 2, …, x n ),x i ∈{0, 1}, 满足∑x i a i n i=1≤12∑a i a i ∈S ,且∑x i a i n i=1最大。
若此时∑x i a i n i=1=12∑a i a i ∈S , 则存在这样的集合划分A ,输出划分结果;否则不存在这样的集合A 。
(2)优化子结构:如果(y 1, y 2,…, y n )是0-1背包问题的有化解,则(y 2, y 3,…, y n )是如下子问题的优化解:∑x i a i n i=2≤12∑a i a i ∈S −a 1y 1;x i ∈{0, 1},2≤i ≤n 。
(3)递推方程:设背包容量为j ,m(i,j)表示背包容量为j ,可选物品为a i ,a i+1,…, a n 时,问题的最优解的代价。
因此递归方程为:m(i,j)=m(i+1,j) 0≤j<a im(i,j)=max(m(i+1,j),m(i+1,j−a i)+a i) j≥a im(n,j)=0 0≤j<a nm(n,j)=a n j≥a n(4)算法伪代码:Input:正整数集合S={a1,a2,a3,…, a n}Output:若存在A ⊆S使得∑a i=∑a ia i∈A, 则输出X; 否则输a i∈S−A出不存在。
SET-PARTITION(S)1 n←length(S),sum←02 for i←1 to n3 do sum←sum+S[i]4 half-sum←sum/25 create array m[1:n,0: half-sum] and X[1:n]6 for j←0 to min(S[n]-1, half-sum)7 do m[n,j]←08 for j←S[n] to half-sum9 do m[n,j]←S[n]10 for i←n-1 to 211 do for j←0 to min(S[i]-1, half-sum)12 do m[i,j]←m[i+1,j]13 for j←S[i] to half-sum14 do m[i,j]←max{m[i+1,j],m[i+1,j-S[i]]+S[i]}15 if half-sum <S[1]16 then m[1, half-sum]=m[2, half-sum]17 else m[1, half-sum]=max{m[2, half-sum],m[2, half-sum -S[1]]+S[1]}18 if m[1, sum/2] < sum/219 then return “不存在”20 w←half-sum21for i←1 to n-122 do if m[i,w]=m[i+1, w]23 then X[1]=024 else X[1]=125 w←w-S[i]26 if w≥S[n]27 then X[n]=028 else X[n]=129 return X时间复杂度分析:第1行时间复杂度为O(1),2~3行时间复杂度为O(n),4~5行时间复杂度为O(1),6~9行时间复杂度为O(n),10~14行时间复杂度为O(n×half-sum),15~20行时间复杂度为O(1),21~26行时间复杂度为O(n),27~29行时间复杂度为O(1)。