算法第三章实验报告
给定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)
心得体会:
解决动态规划问题首先先找到要求解的问题和子问题,再找出其递归方程,不要想太复杂,要保持头脑清醒,逻辑清晰
动态规划个人体会及思考:
动态规划算法基本思想与分治法类似,都是讲待求解问题分解为若干个子问题,不同是动态规划分解得到的子问题往往不是相互独立的。
动态规划问题特征:最优子结构性质;重叠子问题性质。
需要重点掌握:矩阵连乘问题,背包问题等