1. 程式人生 > >動態規劃(1)最大連續字陣列乘積

動態規劃(1)最大連續字陣列乘積

問題描述:
給定一個浮點數陣列,任意取出陣列中的若干個連續的數相乘,請找出其中乘積最大的子陣列。
動態規劃:
概念:動態規劃一般用來求解最優化問題,其適用的條件是要求待求解的最優化問題具備兩個因素:最優子結構和子問題重疊。通過求解一個個最優子問題,將解存入一張表中,當後續子問題的求解需要用到之前子問題的解時直接查表,每次查表的代價為常數時間。
分析本題:
乘積子陣列中可能有正數,負數,也可能有0,因為有負數的存在,所以可以考慮找出最大乘積與最小乘積。於是問題簡化為:在陣列中找到一個子陣列,使得它的乘積最大,同時找到另一個子陣列,使得它的乘積最小。
陣列a[],maxend表示以a[i]結尾的最大連續子陣列乘積,minend表示以a[i]結尾的最小連續子陣列乘積,狀態轉移方程為:
maxend = max(max(maxend*a[i],minend*a[i]),a[i]);
minend = min(min(maxend*a[i],minend*a[i]),a[i]);
c程式碼實現如下:

#include<stdio.h>
#include<stdlib.h>
//#define min(x,y) {return (x) >( y) ?( y) :(x)}
//#define max(x,y) {return (x) >(y) ?(x) : (y)}
double max(double x,double y)
{
    return x > y?x:y;
}
double min(double x,double y)
{
    return x > y ? y : x;
}
double MaxProdectSubstring(double
*a,int length) { double maxEnd = a[0]; double minEnd = a[0]; double result = a[0]; for (int i = 1;i < length;i++) { double end1 = maxEnd*a[i]; double end2 = minEnd*a[i]; maxEnd = max(max(end1,end2),a[i]); minEnd = min(min(end1,end2),a[i]); result = max(maxEnd,result); } return
result; } int main() { double a[] = {-2.5,4,0,3,0.5,8,-1}; double re = MaxProdectSubstring(a,sizeof(a)/sizeof(a[0])); printf("%f\n",re); return 0; }

執行結果如下:
[[email protected] ~]# ./a.out
12.000000
用巨集定義

#include<stdio.h>
#include<stdlib.h>
#define min(x,y) ( (x) >( y) ?( y) :(x))//注意這裡的寫法
#define max(x,y) ( (x) >(y) ?(x) : (y))
/*double max(double x,double y)
{
    return x > y?x:y;
}
double min(double x,double y)
{
    return x > y ? y : x;
}*/
double MaxProdectSubstring(double *a,int length)
{
    double maxEnd = a[0];
    double minEnd = a[0];
    double result = a[0];
    for (int i = 1;i < length;i++)
    {
        double end1 = maxEnd*a[i];
        double end2 = minEnd*a[i];
        maxEnd = max(max(end1,end2),a[i]);
        minEnd = min(min(end1,end2),a[i]);
        result = max(maxEnd,result);
    }
    return result;
}
int main()
{
    double a[] = {-2.5,4,0,3,0.5,8,-1};
    double re = MaxProdectSubstring(a,sizeof(a)/sizeof(a[0]));
    printf("%f\n",re);
    return 0;
}