乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Best Time to Buy and Sell Stock III

       Tornador 2015-05-05

      原題鏈接: http://oj./problems/best-time-to-buy-and-sell-stock-iii/
      這道題是Best Time to Buy and Sell Stock的擴(kuò)展,現(xiàn)在我們最多可以進(jìn)行兩次交易。我們?nèi)匀皇褂脛?dòng)態(tài)規(guī)劃來(lái)完成,事實(shí)上可以解決非常通用的情況,也就是最多進(jìn)行k次交易的情況。
      這里我們先解釋最多可以進(jìn)行k次交易的算法,然后最多進(jìn)行兩次我們只需要把k取成2即可。我們還是使用“局部最優(yōu)和全局最優(yōu)解法”。我們維護(hù)兩種量,一個(gè)是當(dāng)前到達(dá)第i天可以最多進(jìn)行j次交易,最好的利潤(rùn)是多少(global[i][j]),另一個(gè)是當(dāng)前到達(dá)第i天,最多可進(jìn)行j次交易,并且最后一次交易在當(dāng)天賣出的最好的利潤(rùn)是多少(local[i][j])。下面我們來(lái)看遞推式,全局的比較簡(jiǎn)單,

      global[i][j]=max(local[i][j],global[i-1][j]),

      也就是去當(dāng)前局部最好的,和過(guò)往全局最好的中大的那個(gè)(因?yàn)樽詈笠淮谓灰兹绻?dāng)前天一定在局部最好的里面,否則一定在過(guò)往全局最優(yōu)的里面)。對(duì)于局部變量的維護(hù),遞推式是

      local[i][j]=max(global[i-1][j-1]+max(diff,0),local[i-1][j]+diff),

      也就是看兩個(gè)量,第一個(gè)是全局到i-1天進(jìn)行j-1次交易,然后加上今天的交易,如果今天是賺錢的話(也就是前面只要j-1次交易,最后一次交易取當(dāng)前天),第二個(gè)量則是取local第i-1天j次交易,然后加上今天的差值(這里因?yàn)閘ocal[i-1][j]比如包含第i-1天賣出的交易,所以現(xiàn)在變成第i天賣出,并不會(huì)增加交易次數(shù),而且這里無(wú)論diff是不是大于0都一定要加上,因?yàn)榉駝t就不滿足local[i][j]必須在最后一天賣出的條件了)。
      上面的算法中對(duì)于天數(shù)需要一次掃描,而每次要對(duì)交易次數(shù)進(jìn)行遞推式求解,所以時(shí)間復(fù)雜度是O(n*k),如果是最多進(jìn)行兩次交易,那么復(fù)雜度還是O(n)??臻g上只需要維護(hù)當(dāng)天數(shù)據(jù)皆可以,所以是O(k),當(dāng)k=2,則是O(1)。代碼如下:

      雙擊代碼全選
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      public int maxProfit(int[] prices) { 
          if(prices==null || prices.length==0
              return 0
          int[] local = new int[3]; 
          int[] global = new int[3]; 
          for(int i=0;i<prices.length-1;i++) 
          
              int diff = prices[i+1]-prices[i]; 
              for(int j=2;j>=1;j--) 
              
                  local[j] = Math.max(global[j-1]+(diff>0?diff:0), local[j]+diff); 
                  global[j] = Math.max(local[j],global[j]); 
              
          
          return global[2]; 
      }

      可以看到,這里的模型是比較復(fù)雜的,主要是在遞推式中,local和global是交替求解的。不過(guò)理清思路之后,代碼是非常簡(jiǎn)練的,不禁感嘆算法真是牛逼哈,這么個(gè)復(fù)雜生活問(wèn)題幾行代碼就解決了。

      來(lái)源: csdn   作者:Code_Ganker   

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多