面试题 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;
}

posted on 2014-01-26 13:09  Felix Fang  阅读(227)  评论(0)    收藏  举报

导航