面试题 31,连续子数组的最大和 (动态规划练习)

书上给出了两种解法,一种动态规划,一种不是。其实不用动态规划的方法,就是动态规划正过来的推演。
这里还是用动态规划解,代码量会小很多。
子问题划分:
假设f(i)表示以 array[i]结尾的子数组的最优解,也就是说计算f(i)的时候,array[i]肯定是没跑了,在里面的。
递推公式为:当f(i-1)为正数的时候,f(i)= f(i-1) + array[i];当f(i-i)为负数的时候,f(i) = array[i]。
f(0) = array[0]。
实现方法为带记录的递归,递归返回条件为f(0)
边界情况:空数组
代码:
int MaxSubArr(int curIte, int *record, int *list){ if curIte = 0{ record[0] = *list return *list; } if(MaxSubArr(curIte - 1, record, list) < 0){ record[curIte] = list[curIte]; }else{ record[curIte] = list[curIte] + MaxSubArr(curIte - 1, record, list); } return record[curIte]; } int MaxSum(int *list, int size){ if(list == NULL) return NULL; int record = new int[size]; MaxSubArr(size-1, record, list); int max = record[0]; for(int i = 0;i < size;i++){ if(max < record[i]) max = record[i]; } return max; }
书中代码,比我简洁太多了:
int FindGreatestSumOfSubArray(int *pData, int nLength) { if((pData == NULL) || (nLength <= 0)) { g_InvalidInput = true; return 0; } g_InvalidInput = false; int nCurSum = 0; int nGreatestSum = 0x80000000; for(int i = 0; i < nLength; ++i) { if(nCurSum <= 0) nCurSum = pData[i]; else nCurSum += pData[i]; if(nCurSum > nGreatestSum) nGreatestSum = nCurSum; } return nGreatestSum; }
------------------------------------------------
Felix原创,转载请注明出处,感谢博客园!
posted on 2014-01-26 13:09 Felix Fang 阅读(227) 评论(0) 收藏 举报
浙公网安备 33010602011771号