第三章算法实验报告

1.1 问题描述

7-1 最大子段和 (25 分)
 

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

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

1.2 算法描述

本题是要求一个序列中子段最大的和,我们需要记录每段连续子段的和,期间找出最大值,在找的时候如果遇到和小于0就说明这个数之前的数相加为负数,我们会舍弃它,因为和负数相加只会越加越小,然后我们直接从当前计算,一直这样循环,一次次相加后,到了数列最后一个数时一定会有一个最大值,然后我们保留这个最大值并输出他就是我们要的答案

1.3 问题求解:

1.1.1 根据最优子结构性质,列出递归方程式,

 

 

 dp方程如下,其问题被分解为加到第i项时,前面i-1项子段的最大字段和与第i项相加后再与第i项比较谁大,谁大就选谁填入表中

1.1.2 给出填表法中表的维度、填表范围和填表顺序。

该表维度为一维表格

 

 

 

 

1.1.3 分析该算法的时间和空间复杂度

该算法为填一维表,所以时间复杂度为O(n)同时开辟一个dp[n]数组显然空间复杂度为O(n)

1.3 心得体会(对本次实践收获及疑惑进行总结)

一开始生硬的使用了递归解题,没有用动态规划的思想,后面列出动态方程后没有快速理解子问题的划分与填入表格中的每个数的含义

收获:以后看到类似的题目可以先通过题目中的数据慢慢找到动态方程,然后再慢慢填表验证

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

代码简短,不用像递归一样写很多条件语句,但是再构思动态方程与填表需要花更多的时间思考验证

posted @ 2021-10-25 10:48  黄仲祺  阅读(28)  评论(0编辑  收藏  举报