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 }

 

测试数据和结果两份:

posted @ 2013-09-20 09:49  李鲲  阅读(216)  评论(1)    收藏  举报