亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

利用C語言來求最大連續子序列乘積的方法

2020-01-26 14:58:58
字體:
來源:轉載
供稿:網友

題目描述:給一個浮點數序列,取最大乘積連續子串的值,例如 -2.5,4,0,3,0.5,8,-1,則取出的最大乘積連續子串為3,0.5,8。也就是說,上述數組中,3 0.5 8這3個數的乘積3*0.5*8=12是最大的,而且是連續的。

提醒:此最大乘積連續子串與最大乘積子序列不同,請勿混淆,前者子串要求連續,后者子序列不要求連續。也就是說:最長公共子串(Longest CommonSubstring)和最長公共子序列(LongestCommon Subsequence,LCS)的區別:


    子串(Substring)是串的一個連續的部分,子序列(Subsequence)則是從不改變序列的順序,而從序列中去掉任意的元素而獲得的新序列;
    更簡略地說,前者(子串)的字符的位置必須連續,后者(子序列LCS)則不必。比如字符串“ acdfg ”同“ akdfc ”的最長公共子串為“ df ”,而它們的最長公共子序列LCS是“ adf ”,LCS可以使用動態規劃法解決。

解答:

    解法一、窮舉,所有的計算組合:
    或許,讀者初看此題,自然會想到最大乘積子序列問題類似于最大子數組和問題:http://blog.csdn.net/v_JULY_v/article/details/6444021,可能立馬會想到用最簡單粗暴的方式:兩個for循環直接輪詢。

    解法二、雖說類似于最大子數組和問題,但實際上具體處理起來諸多不同。為什么呢,因為乘積子序列中有正有負也還可能有0。我們可以把問題簡化成這樣:數組中找一個子序列,使得它的乘積最大;同時找一個子序列,使得它的乘積最?。ㄘ摂档那闆r)。因為雖然我們只要一個最大積,但由于負數的存在,我們同時找這兩個乘積做起來反而方便。也就是說,不但記錄最大乘積,也要記錄最小乘積。So,我們讓maxCurrent表示當前最大乘積的candidate,minCurrent反之,表示當前最小乘積的candidate,而maxProduct則記錄到目前為止所有最大乘積candidates的最大值。(以上用candidate這個詞是因為只是可能成為新一輪的最大/最小乘積)由于空集的乘積定義為1,在搜索數組前,maxCurrent,minCurrent,maxProduct都賦為1。
假設在任何時刻你已經有了maxCurrent和minCurrent這兩個最大/最小乘積的candidates,新讀入數組的元素x(i)后,新的最大乘積candidate只可能是maxCurrent或者minCurrent與x(i)的乘積中的較大者,如果x(i)<0導致maxCurrent<minCurrent,需要交換這兩個candidates的值。當任何時候maxCurrent<1,由于1(空集)是比maxCurrent更好的candidate,所以更新maxCurrent為1,類似的可以更新minCurrent。任何時候maxCurrent如果比最好的maxProduct大,更新maxProduct。

    解法三、本題除了上述類似最大子數組和的解法,也可以直接用動態規劃求解(其實,上述的解法一本質上也是動態規劃,只是解題所表現出來的具體形式與接下來的解法二不同罷了。這個不同就在于下面的解法二會寫出動態規劃問題中經典常見的DP方程,而解法一是直接求解)。具體解法如下:
    假設數組為a[],直接利用動歸來求解,考慮到可能存在負數的情況,我們用Max來表示以a結尾的最大連續子串的乘積值,用Min表示以a結尾的最小的子串的乘積值,那么狀態轉移方程為:
       Max=max{a, Max[i-1]*a, Min[i-1]*a};
       Min=min{a, Max[i-1]*a, Min[i-1]*a};
 初始狀態為Max[1]=Min[1]=a[1]。


下面來看一道具體的ACM題目
 題目

    題目描述: 
    給定一個浮點數序列(可能有正數、0和負數),求出一個最大的連續子序列乘積。 
    輸入: 
    輸入可能包含多個測試樣例。 
    每個測試樣例的第一行僅包含正整數 n(n<=100000),表示浮點數序列的個數。 
    第二行輸入n個浮點數用空格分隔。 
    輸入數據保證所有數字乘積在雙精度浮點數表示的范圍內。 
    輸出: 
    對應每個測試案例,輸出序列中最大的連續子序列乘積,若乘積為浮點數請保留2位小數,如果最大乘積為負數,輸出-1。 
    樣例輸入:  

  7   -2.5 4 0 3 0.5 8 -1   5   -3.2 5 -1.6 1 2.5   5   -1.1 2.2 -1.1 3.3 -1.1 

    樣例輸出:  

  12   64   8.78 


思路
最大連續子序列乘積和最大連續子序列和不同,這里先回憶一下最大連續子序列和的最優解結構:

最大連續子序列和
我們用sum[i]來表示以arr[i]結尾的最大連續子序列和,則狀態轉移方程為:

2015811105410788.png (419×69)

最大連續子序列乘積
考慮存在負數的情況(ps:負負會得正),因此我們用兩個輔助數組,max[i]和min[i],max[i]來表示以arr[i]結尾的最大連續子序列乘積,min[i]來表示以arr[i]結尾的最小連續子序列乘積,因此狀態轉移方程為:

2015811105443408.png (567×48)

and

2015811105503383.png (565×49)

有了狀態轉移方程,dp代碼就很容易實現了,看到這里還不理解的同學,我建議你多花點時間用在算法學習上吧!

AC代碼

  

 #include <stdio.h>   #include <stdlib.h>       double maxNumInThree(double a, double b, double c)   {     double max;     max = (a > b) ? a : b;     max = (max > c) ? max : c;         return max;   }       double minNumInThree(double a, double b, double c)   {     double min;     min = (a < b) ? a : b;     min = (min < c) ? min : c;         return min;   }           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;   } 

       
    /**************************************************************
        Problem: 1501
        User: wangzhengyi
        Language: C
        Result: Accepted
        Time:110 ms
        Memory:4964 kb
    ****************************************************************/ 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美电影在线观看网站| 亚洲国产精久久久久久久| 日韩美女av在线| 亚洲视频国产视频| 日韩最新免费不卡| 欧美午夜丰满在线18影院| 97精品国产91久久久久久| 久久久久久久久久久亚洲| 国产欧美最新羞羞视频在线观看| 日韩欧美999| 亚洲成人av片在线观看| 成人免费观看网址| 日韩av观看网址| 日韩欧美国产一区二区| 国产www精品| 亚洲a区在线视频| 69av视频在线播放| 欧美激情极品视频| 九九九久久久久久| 亚洲无限乱码一二三四麻| 欧美日在线观看| 亚洲毛片在线免费观看| 久久99国产精品自在自在app| 在线精品播放av| 两个人的视频www国产精品| 欧美三级免费观看| 中文字幕亚洲一区二区三区五十路| 精品国产乱码久久久久久虫虫漫画| 国产区精品在线观看| 欧美激情综合色| 日韩av片免费在线观看| 国产精品成熟老女人| 国产97在线播放| 亚洲码在线观看| 美日韩丰满少妇在线观看| 欧美尺度大的性做爰视频| 精品高清一区二区三区| 国产精品久久久999| 在线亚洲男人天堂| 久久精品视频免费播放| 这里只有视频精品| 欧美日韩亚洲国产一区| 欧美巨乳美女视频| 国产噜噜噜噜噜久久久久久久久| 日韩在线免费高清视频| 91精品国产综合久久香蕉的用户体验| 欧美精品激情在线观看| 国产91精品不卡视频| 日韩免费在线视频| 久久久国产一区二区三区| 久久久免费在线观看| 草民午夜欧美限制a级福利片| 操人视频在线观看欧美| xvideos成人免费中文版| 一区二区三区回区在观看免费视频| 欧美中文字幕视频| 欧洲日本亚洲国产区| 亚洲男人天堂久| 亚洲精品在线看| 久久亚洲精品中文字幕冲田杏梨| 国产视频一区在线| 8090理伦午夜在线电影| 性欧美视频videos6一9| 国产欧美最新羞羞视频在线观看| 日韩电影在线观看永久视频免费网站| 色婷婷综合成人| 久久久精品国产亚洲| 欧洲中文字幕国产精品| 视频一区视频二区国产精品| 九九热最新视频//这里只有精品| 欧美电影第一页| 日韩中文字幕在线免费观看| 国产97在线|日韩| 夜夜狂射影院欧美极品| 亚洲欧美日韩在线一区| 亚洲视频在线观看视频| 精品亚洲男同gayvideo网站| 亚洲精品中文字幕av| 欧美在线视频在线播放完整版免费观看| 日本亚洲欧美三级| 日本精品视频在线观看| 午夜精品久久久久久久99黑人| 国产精品久久久久久久久久久久久久| 久久精品国产久精国产一老狼| 欧美性猛交xxxxx免费看| 在线观看国产精品91| 亚洲免费高清视频| 欧美精品videofree1080p| 亚洲在线免费视频| 亚洲精品国偷自产在线99热| 久久久黄色av| 成人午夜激情免费视频| 日韩精品黄色网| 成人性生交大片免费看小说| 中文字幕视频在线免费欧美日韩综合在线看| 国产综合在线视频| 青青久久av北条麻妃海外网| 亚洲乱码国产乱码精品精| 欧美精品www| 日韩欧美中文字幕在线观看| 成人h猎奇视频网站| 亚洲精品美女在线| 日韩精品欧美国产精品忘忧草| 日韩欧美在线视频观看| 亚洲美女自拍视频| 中文欧美日本在线资源| 国内精品久久久久影院 日本资源| 欧美日韩国产在线看| 国产精品视频精品视频| 亚洲伊人成综合成人网| 97国产在线视频| 国产精品久久久久影院日本| 久久久久亚洲精品国产| 高清欧美电影在线| 久久久www成人免费精品| 日韩精品日韩在线观看| 久久国产精品首页| 亚洲美女精品久久| 欧美日韩国产第一页| 午夜精品久久久久久久久久久久| 国产999精品久久久影片官网| 成人亚洲欧美一区二区三区| 亚洲国产精彩中文乱码av在线播放| 亚洲精品一区久久久久久| 一本一本久久a久久精品牛牛影视| 欧美尤物巨大精品爽| 91久久综合亚洲鲁鲁五月天| 亚洲偷熟乱区亚洲香蕉av| 91精品视频在线免费观看| 中文在线资源观看视频网站免费不卡| 久久69精品久久久久久久电影好| 亚洲性生活视频在线观看| 国产精品国产自产拍高清av水多| 亚洲视频网站在线观看| 国产精品美女999| 狠狠色狠色综合曰曰| 美日韩在线视频| 欧美福利视频在线| 国产亚洲欧美另类中文| 欧美中文在线视频| 久久91亚洲人成电影网站| 岛国精品视频在线播放| 日本高清+成人网在线观看| 北条麻妃一区二区在线观看| 91人人爽人人爽人人精88v| 亚洲人成在线一二| 久久久女人电视剧免费播放下载| 亚洲国产一区二区三区在线观看| 热99精品里视频精品| 色婷婷av一区二区三区在线观看| 亚洲xxxx做受欧美| 中文字幕av一区二区三区谷原希美| 精品久久国产精品| 国产精品福利在线| 久久成人av网站| 亚洲性av在线| 久久精品国产一区二区三区| 久久久久国产精品一区| 国产亚洲a∨片在线观看| 日本精品视频在线播放| 欧美电影免费观看高清完整| www国产91| 一区二区在线免费视频| 98精品国产自产在线观看|