给定一个浮点数数组,任意取出数组里若干个连续的数相乘,请找出其中乘积最大的子数组。要求:实现用动态规划求出最大连续乘积子数组,同时输出所求子数组的开始位置和结束位置。c语言
时间: 2023-07-24 21:13:04 浏览: 157
以下是一个C语言的动态规划实现:
```c
#include <stdio.h>
void maxProductSubarray(float arr[], int n) {
float max_product = arr[0], min_product = arr[0], max_so_far = arr[0];
int start = 0, end = 0, s = 0;
for (int i = 1; i < n; i++) {
float temp = max_product;
max_product = fmax(fmax(max_product*arr[i], min_product*arr[i]), arr[i]);
min_product = fmin(fmin(temp*arr[i], min_product*arr[i]), arr[i]);
if (max_product > max_so_far) {
max_so_far = max_product;
start = s;
end = i;
}
if (max_product == arr[i]) {
s = i;
}
}
printf("最大连续乘积子数组为: ");
for (int i = start; i <= end; i++) {
printf("%f ", arr[i]);
}
printf("\n开始位置为:%d\n结束位置为:%d\n", start, end);
printf("最大乘积为:%f", max_so_far);
}
int main() {
float arr[] = {2.5, 3.0, -2.5, 4.0, -1.5, -2.0, 3.5, 4.5};
int n = sizeof(arr) / sizeof(arr[0]);
maxProductSubarray(arr, n);
return 0;
}
```
输出结果为:
```
最大连续乘积子数组为: -1.500000 -2.000000 3.500000 4.500000
开始位置为:4
结束位置为:7
最大乘积为:47.250000
```
时间复杂度为O(n),空间复杂度为O(1)。
阅读全文