Re: [問題] 連續整數,找出乘積最大?

看板java作者時間17年前 (2008/06/09 01:06), 編輯推噓2(201)
留言3則, 3人參與, 最新討論串12/12 (看更多)
好久的文章, 還是回一下.. 我的演算是O(n)的演算法, 這裡的trick是因為整數絕對值只會愈乘愈大, 所以不用dynamic programming 初始三個變數 max = 0 //目前為止最大連乘積 product = 1 //連乘積 productAfterFirstMinus = 0; //第一個負號後的連乘積 每讀一個數字x進來{ if(x == 0){ product = 1; productAfterFirstMinus = 0; }else{ product *= x; productAfterFirstMinus *= x; max = Max(max, product, productAfterFirstMinus); if(productAfterFirstMinus == 0 && x < 0){ productAfterFirstMinus = 1; } } } 不知道這樣寫有沒有人看的懂..orz ※ 引述《Domos (Domos)》之銘言: : 看一下這個O(n)的演算法work不work : 假設有n個數字要求max : 我們把題目分解成n-1個數字 : 第n個數字如果為正,則求n-1的max : 第n個數字如果為負,則求n-1的min : 第n個數字如果為零,則求n-1的max : 接下來用同樣演算法去求出n-1的結果 : 以下是此演算法用DP實作: : a[] 選這個數字的MAX : b[] 不選這個數字的MAX : c[] 選這個數字的MIN : d[] 不選這個數字的MIN : e[] 此這個數字開始的值 : 數字存在num[]裡 : a[0],b[0],c[0],d[0],e[0]全部歸零 : for i = 1 ~ n : //以下x請改成num[i] 怕亂不這樣寫 : a[i] = max(x * a[i-1],x * c[i-1],x * e[i-1]) : b[i] = max(a[i-1],b[i-1],c[i-1],d[i-1],e[i-1]) : c[i] = min(x * a[i-1],x * c[i-1],x * e[i-1]) : d[i] = min(a[i-1],b[i-1],c[i-1],d[i-1],e[i-1]) : e[i] = x : 輸出a[n],b[n],c[n],d[n],e[n]最大值 : example: : 0,1,3,-12,3,-1,4,0,-10,12,3,-2,-5,-7,-10,-1,3,2,-1,0 : a b c d e : 0 0 0 0 0 ini 這裡出錯了(或者說題目沒定義) : 如果可以選出空集合,那沒錯,如果一定要選出至少一個, : 這裡就得改成num[1]而非0 : 0 0 0 0 0 i=1 : 0 0 0 0 1 i=2 : 3 1 0 0 3 ... : 0 3 -36 0 -12 : 0 3 -108 -36 3 : 108 3 -3 -108 -1 : 432 108 -432 -108 4 : 0 432 0 -432 0 : 0 432 0 -432 -10 : 0 432 -120 -432 12 : 36 432 -360 -432 3 : 720 432 -72 -432 -2 : 360 720 -3600-432 -5 : ... 懶的打了 : d似乎可以省略,不過還是O(n) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.37.194

06/09 11:30, , 1F
謝謝大大熱心分享~~昨天突然斷線很抱歉^^
06/09 11:30, 1F

06/10 05:55, , 2F
special case: 如果只輸入一個負數會錯(逃)
06/10 05:55, 2F

06/27 14:10, , 3F
看你希望輸入一個負數的答案是負還是0吧
06/27 14:10, 3F
bleed1979:轉錄至看板 Soft_Job 07/04 03:16
文章代碼(AID): #18J16b9W (java)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 12 之 12 篇):
文章代碼(AID): #18J16b9W (java)