3)教科书三本都想读:优先级为《代码大全》、《敏捷开发》、《重构》
4)从第二次作业开始每次都写效能分析的优化和单元测试。
5)思路一:一开始看到这个题目,有一个想法是分规模,比如数组为a[n],当子数组只有1个数时,比较各个子数组的和的大小,一直考虑到子数组有n个数,发现此种算法复杂度为O(n^3),放弃;
思路二:考虑动态规划解法,对数组a[n],目标函数为b[1,j] = max{sum[j], b[1,j-1]}, j>1; b[1,1] = a[1].
而sum[j]=max{sum[j-1]+a[j], a[j]}, j>1; sum[1] =a[1]. 很轻松地可以看出来,算法复杂度为O(n).这是两层的动态规划,需要维护两个数组,想了一个晚上才想出来。不过有了目标函数就好办了。
具体算法如下:
1 int max(int a[], int n) 2 { 3 int max = a[0]; 4 int sum = a[0]; 5 int i; 6 for(i = 0; i < n; i++){ 7 sum = sum+a[i] > a[i] ? sum+a[i] : a[i]; 8 max = max > sum ? max : sum; 9 } 10 return max; 11 }