因为数组中包括负数。 设maxEnd表示以a[i]结尾的最大连续子数组的乘积值。 设minEnd表示以a[i]结尾的最小连续子数组的乘积值。 可得到状态转移方程: 1、maxEnd=max{ max{maxEnd*a[i],minEnd*a[i]},a[i]); ( 意思是:以a[i]结尾的最大(小)连续子数组的乘积值是:A,B,C中的最大值。 A:以a[i-1]结尾的最大连续子数组的乘积值 B:以a[i-1]结尾的最小连续子数组的乘积值 C:a[i]自身的值 ) 2、minEnd=min{ min{minEnd*a[i],minEnd*a[i]},a[i]}; 由状态转移方程可以写出代码:
static double a[] = new double[] { -2.5, 4, 0, 3, 0.5, 8, -1 }; static double maxResult; static double maxEnd; static double minEnd; public static void main(String[] args) { getResult2(); } /** * 动态规划法 */ public static void getResult2() { for (int i = 1; i < a.length; i++) { double end1 = maxEnd * a[i]; double end2 = minEnd * a[i]; maxEnd = Math.max(Math.max(end1, end2), a[i]); minEnd = Math.min(Math.min(end1, end2), a[i]); maxResult = Math.max(maxResult, maxEnd); } System.out.println(maxResult); }We often hear of people breaking down from overwork,but in nine cases out of ten they are really suffering from worry or anxiety.