http://blog.csdn.net/wzy_1988/article/details/9319897
最大连续子序列乘积和最大连续子序列和不同,这里先回忆一下最大连续子序列和的最优解结构:
最大连续子序列和
我们用sum[i]来表示以arr[i]结尾的最大连续子序列和,则状态转移方程为:
最大连续子序列乘积
考虑存在负数的情况(ps:负负会得正),因此我们用两个辅助数组,max[i]和min[i],max[i]来表示以arr[i]结尾的最大连续子序列乘积,min[i]来表示以arr[i]结尾的最小连续子序列乘积,因此状态转移方程为:
and
有了状态转移方程,dp代码就很容易实现了
- int main(void)
- {
- int i, n;
- double *arr, *max, *min, res;
- while (scanf("%d", &n) != EOF) {
- arr = (double *)malloc(sizeof(double) * n);
- max = (double *)malloc(sizeof(double) * n);
- min = (double *)malloc(sizeof(double) * n);
- for (i = 0; i < n; i ++)
- scanf("%lf", arr + i);
- // 动态规划求最大连续子序列乘积
- max[0] = min[0] = res = arr[0];
- for (i = 1; i < n; i ++) {
- max[i] = maxNumInThree(arr[i], max[i - 1] * arr[i], min[i - 1] * arr[i]);
- min[i] = minNumInThree(arr[i], max[i - 1] * arr[i], min[i - 1] * arr[i]);
- if (max[i] > res)
- res = max[i];
- }
- if (res >= 0) {
- // 判断是否为浮点数
- if ((res - (int)res) == 0)
- printf("%d\n", (int)res);
- else
- printf("%.2lf\n", res);
- } else {
- printf("-1\n");
- }
- free(arr);
- }
- return 0;
- }