题目描述
给定一个double类型的数组arr,其中的元素可正可负可0,返回子数组累乘的最大乘积。例如arr=[-2.5,4,0,3,0.5,8,-1],子数组[3,0.5,8]累乘可以获得最大的乘积12,所以返回12。
由于可能出现0 负数 负负得正情况
采取动态规划策略 记录以arr[i]结尾的子数组最大以及最小乘积
double max_dp[10000];//存放以i结尾最大子数组乘积
double min_dp[10000];//存放以i结尾最小子数组乘积
那么动态转移中
下一次的最值 一定在 自身,自身与之前最大乘积, 自身与之前最小乘积 中取得
double maxProduct(vector<double> arr) {
max_dp[0]=arr[0];
min_dp[0]=arr[0];
double max_=arr[0];
for(int i=1;i<arr.size();i++)
{
//最大乘积 在自身 自身与之前最大乘积 自身与之前最小乘积(负负得正情况) 三者中取得
max_dp[i]=max(arr[i],max(arr[i]*max_dp[i-1],arr[i]*min_dp[i-1]));
min_dp[i]=min(arr[i],min(arr[i]*max_dp[i-1],arr[i]*min_dp[i-1]));
if(max_dp[i]>max_)
max_=max_dp[i];
}
return max_;
}