import java.lang.Math;
//动态规划
public class Solution {
public double maxProduct(double[] arr) {
int length = arr.length;
//特殊值(空数组)处理
if(length == 0){
return 0;
}
//数组长度为1
if(length == 1){
return arr[0];
}
double[] max_dp = new double[length];//最大值数组,max_dp[i]表示前i个数中的最大乘积
double[] min_dp = new double[length];//最小值数组
max_dp[0] = arr[0];
min_dp[0] = arr[0];
double max = arr[0];
for(int i=1;i<length;i++){
//动态规划,最优子结构,状态转换方程。
//使用两个dp数组是因为元素中的数可以为负数,有负号影响(负数*最小值也可能是最大值)。
//最大值可以有三个来源:
//一是数组当前的值(arr[i]);
//二是数组当前的值(arr[i])*max_dp[i-1],即是正数*最大值;
//三是数组当前的值(arr[i])*min_dp[i-1],即是负数*最小值;
//最大值来源不能是max_dp[i-1]的原因是题目要求的是子数组(连续)的最大乘积。
max_dp[i] = Math.max(Math.max(min_dp[i-1]*arr[i],arr[i]),max_dp[i-1]*arr[i]);
min_dp[i] = Math.min(Math.min(max_dp[i-1]*arr[i],arr[i]),min_dp[i-1]*arr[i]);
if(max_dp[i] > max){
max = max_dp[i];
}
}
return max;
}
}