算法第三章上机实践报告

最大子段和

1.1问题描述:给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时,定义子段和为0。

要求算法的时间复杂度为O(n)。

输入格式:

输入有两行:

第一行是n值(1<=n<=10000);

第二行是n个整数。

输出格式:

输出最大子段和。

输入样例:

在这里给出一组输入。例如:

6

-2 11 -4 13 -5 -2

结尾无空行

输出样例:

在这里给出相应的输出。例如:

20
结尾无空行

1.2 算法描述(动态规划)

 添加一个一维数组b[n+1],初始化为0,其中b[j](1<=j<=n)表示以a[j]结尾的最大子段和,数组b[n+1]中的最大值即为所求题目中数组a[n+1]的最大子段和。

1.3问题求解

 

 

1

1.4 递归方程式

b[j]=min{b[j-1]+a[j],a[j]}   1<=j<=n

1.5 填表

b[1]

b[2]

b[3]

b[j]

b[n-1]

b[n]

表为一维表格;填表范围为1-n;填表顺序是从b[1]填到b[n].

1.6 算法的复杂度

时间复杂度:O(n);

空间复杂度:O(n);

1.7 心得体会

做编程题时,不只要把题做出来,还要并明白自己的算法是什么。比喻动态规划算法,在做这类题的同时清楚自己的递归方程是什么,是非常重要的。

 

2对动态规划算法的理解和体会

动态规划算法是经典的最优值寻找算法,算法的每一步都会考虑是否全局最优。它是将待求解问题分成若干个子问题,求解子问题的最优解,最后一个子问题的最优解就是初始问题的解。对于重叠子问题,为了减少运算,对每个子问题只求解一次,将子问题不同阶段的不同状态保存在一个二维数组中。

我认为动态规划算法的难点在于找到初始题的子问题是什么,以及知道递归方程是什么和对边界条件的判断。

posted @ 2021-10-23 11:57  曾梦缘  阅读(34)  评论(0编辑  收藏  举报