此题求最大值,可以将动态规划数组的第 i 个数字表示为加入第 i 个位置数字后的最大值。但由于此题存在负数乘法,可能最小值变为最大值,所以需要将最大值与最小值为 amax,amin 都存储(按照原始动态规划应该存储在 dp 数组中,但由于更新只与上一状态有关,可以直接存储数字,更新即可,这样可节约内存),然后比较 maxdp[i-1]*arr[i],mindp[i-1]*arr[i],arr[i] 之间的最大值与最小值,并更新 amax,amin。将每个状态的 amax 的最大值作为结果返回。
注:此思想可用于有负数的子数组最大和或差

func maxProduct( arr []float64 ) float64 {
    // write code here
//     if len(arr) == 1{
//         return arr[0]
//     }
    amin,amax,res := arr[0],arr[0],arr[0]
    for i:=1;i<len(arr);i++{
        amax,amin = max(max(amin*arr[i],amax*arr[i]),arr[i]),min(min(arr[i]*amin,arr[i]*amax),arr[i])
        res = max(amax,res)
    }
    return res
}

func max(i,j float64)float64{
    if i>j{
        return i
    }else{
        return j
    }
}

func min(i,j float64)float64{
    if i > j{
        return j 
    }else{
        return i
    }
}