算法第三章实验报告

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

给定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、所加全为负数,输出0;如何判断全为负数?--用一个循环遍历数组a[n],定义一个变量记录负数个数,如果该变量的值等于n则说明该数组全为负数

2.数组不全为0,求出最大子段和并输出

递归方程:f(i)=max{f(i-1)+a[i],a[i]}

f(i)表示第i个数结尾连续子数组最大和,f(0)=-2

f(1)=11

f(2)=max{f(1)+a[2],a[2]},   a[2]=-4,  f(1)+a[2]=7 --> f(2)=7

f(3)=max{f(2)+a[3],a[3]},  a[3]=13,  f(2)+a[3]=20  --> f(3)=20 为最大值

最大子段和为20

 

算法描述:

 

 

 递归方程式:

f(i)=max{f(i-1)+a[i],a[i]}

 

填表法表的维度,填表范围和填表顺序:

一维表格,填表范围为1-n,填表顺序从左往右填

 

算法时间及空间复杂度分析:

没有循环的嵌套,时间复杂度为O(n)

 

心得体会:

解决动态规划问题首先先找到要求解的问题和子问题,再找出其递归方程,不要想太复杂,要保持头脑清醒,逻辑清晰

 

动态规划个人体会及思考:

动态规划算法基本思想与分治法类似,都是讲待求解问题分解为若干个子问题,不同是动态规划分解得到的子问题往往不是相互独立的。

动态规划问题特征:最优子结构性质;重叠子问题性质。

需要重点掌握:矩阵连乘问题,背包问题等

posted @ 2021-10-24 13:56  欧丹萍  阅读(50)  评论(0编辑  收藏  举报