算法第三章上机报告
作者:互联网
1.实践题目
7-2 最大子段和 (40 分)给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时,定义子段和为0。要求算法的时间复杂度为O(n)。
2.问题描述
题目求的是最大字段和,且要求时间复杂度为O(n),应运用动态规划法将之前的运算结果存下,从而降低时间复杂度。
3.算法描述
运用动态规划法最重要的是写出其动态规划递归式,temp[i]=max{b[i-1]+a[i],a[i]} (1<=i<=n),其中temp的作用是记录当前的和,若比当前的sum大则记录到sum中,最后输出的sum便是最大值。
1 public static int MaxSum(int n, int[] a) { 2 int sum = 0, temp = 0; 3 for (int i = 1; i <= n; i++) { 4 if (temp > 0) 5 temp += a[i]; 6 else 7 temp = a[i]; 8 if (temp > sum) 9 sum = temp; 10 } 11 return sum; 12 }算法代码
4.算法时间及空间复杂度分析
时间复杂度:算法中只有一个for循环,因此为O(n)
空间复杂度:算法中用到了一个和原序列等大的辅助空间,因此为O(n)
5.心得体会
本次实践的题目算法主要运用的都是动态规划法,运用该方法最重要是先写出递归式,递归式写出来之后,算法也就很好解决了。同时,动态规划法一般要用到辅助数组(空间),能降低时间复杂度,提升算法效率。
标签:第三章,上机,temp,int,复杂度,规划法,算法,sum 来源: https://www.cnblogs.com/Daylight-Deng/p/11707273.html