homework-01 一维数组的连续最大子数组的和问题
/*看了第二次作业的要求,_(:3J∠)_感觉自己弱爆了*/
/*不怎么会写技术博文,感觉压力山大*/
1、不知道Github如何传“测试用例, 使用说明, 测试数据”,于是我把这三个东西贴在博文里面了
2、题目描述很简单,在这里也不重复说明了,大概讲一下思路
3、一维数组的连续最大子数组的和,这是一道非常古老而且标准的动态规划问题。该题思想为,每一个数为一个阶段,当遍历完整个数组后,即走完了所有阶段。正反遍历没有差别
动态转移方程为:a[i] = max(a[i], a[i]+a[i+1]) | 0 <= i < n-1/*逆序*/
4、我写的代码比较水了,还请不要在意太多。
5、关于输入与输出,数组长度是手动输入的,测试数据附在后面的图里。
6、这道题目可以延伸的部分有具体子数组的输出、无限测试、第N大子数组和、非连续但有限制长度的最大子数组的和。一维数组的玩法很多,我就不多说了- -没有代码都是扯淡的……
7、第一次作业做得比较水_(:3J∠)_有关代码修改和精致的问题,以后努力学习。
使用说明:
手动输入数组长度n,及数组a
输出连续最大子数组的和
代码详细:
1 #include<stdio.h> 2 //一位数组的最大子数组的和问题 3 //O(n)的时间复杂度,采用的动态规划的思想,每一个数为一个阶段,然后动态转移 4 //本代码使用的是逆序,也可以顺序,没有差异 5 6 int max(int x, int y) 7 { 8 return (x > y) ? x : y; 9 } 10 11 int test(int *A, int n) 12 { 13 int i; 14 int sum, sumA; 15 16 sum = A[n-1]; 17 sumA = A[n-1]; 18 19 for(i = n-2; i >= 0; i--){ 20 sumA = max(A[i], A[i]+sumA); 21 sum = max(sum, sumA); 22 } 23 24 return sum; 25 } 26 27 int main() 28 { 29 int i, n; 30 int A[1000]; 31 32 scanf("%d", &n); 33 for (i = 0; i < n; i++) 34 scanf("%d", &A[i]); 35 36 printf("Max:%d\n", test(A, n)); 37 38 return 0; 39 }
测试数据和结果两份:



浙公网安备 33010602011771号