筆試編程題必殺技——動態規劃

來源:互聯網
上載者:User

標籤:

在筆試編程題中,最常見題型莫過於動態規划了,以前一直不太清楚,今天下定決心好好梳理一番。

動態規劃是通過組合子問題的解決而解決整個問題的,一個大問題分解成一個小問題,這個小問題再分成小問題,以此類推,直至求出最終結果。

首先看一個把我虐了無數遍的問題:最大子數組的問題。

題目:一個有N個整數元素的一位元組(A[0], A[1],...,A[n-1], A[n]),這個數組當然有很多子數組,那麼數組之和的最大值是什麼呢?

例如:有數組int A[5] = {-1, 2, 3, -4, 2};合格子數組為2,3,最終答案為5。

明確一下題意:1、子數組必須是連續的。

    2、不需要知道最後符合要求的子數組具體是什麼,在什麼位置。

    3、數組中可以包含正數、負數、0。

首先我們看看最簡單的也是我當初都不會的窮舉法(羞愧ing):

public static int findMaxSubArray(int[] A, int n){int max = Integer.MIN_VALUE;for(int i=0; i<n; i++){int sum = 0;for(int j=i; j<n; j++){sum += A[j];if(sum > max){max = sum;}}}return max;}

這種方法簡單粗暴,依次求出每個子數組之後,找出最大值。

時間複雜度是o(n^2)。

這樣的方法會不會有點low呢,面試官們會喜歡嗎?當然不!這題他們是想考你動態規劃!!!

我們來捋一捋題目,考慮數組的第一個元素和最大的一段數組,即A[0]和(A[I],...,A[j])的關係,有如下情況:

1、當0=i=j時,元素A[0]就是最大的一段

2、當0=i<j時,和最大的一段從A[0]開始

3、當0<i時,元素A[0]和最大的一段沒有關係

可以將一個大問題(N個元素數組)轉化為一個較小的問題(N-1個元素數組),如果知道(A[1],...,A[n-1])中和最大的一段數組之後為All[1],並且知道(A[1],...,A[n-1])中包含A[1]的和最大的一段數組為start[1],那麼不難得出結論:(A[1],...,A[n])中的問題的答案All[0] = max{A[0], A[0]+srart[1], All[1]},通過這麼一分析,可能你蒙圈了,但是簡而言之,將A[0]和剩下元素分開看,如果知道剩下元素組成的數組的最大子數組之後sum,那麼整個數組的最大子數組之後就是A[0],A[0]+sum, sum三者之間的最大值了。

</pre><pre name="code" class="java">public static int dongtaifind(int[] A, int n){int start = A[n-1];int max = A[n-1];for(int i=n-2; i>=0; i--){start = max(A[i], start+A[i]);max = max(start, max);}return max;}public static int max(int m, int n){if(m >= n)return m;else {return n;}}

這個問題我們暫時告一段落:

下面看一下更加經典的01背包問題:

有N件物品和一個容量為V的背包。第i件物品的體積是c[i],價值是v[i]。求解將哪些物品裝入背包可使價值總和最大。

我們把題目具體下, 有5個商品,背包的體積為10,他們的體積為 c[5] = {3,5,2,7,4};  價值為 v[5] = {2,4,1,6,5};

一個物品可以放或不放。

如果一個問題的最優解包含了物品n,即Xn = 1,那麼其餘X1, X2, .....,Xn-1 一定構成子問題1,2,.....,n-1在容量C - cn時的最優解。

如果這個最優解不包含物品n,即Xn = 0; 那麼其餘 X1, X2.....Xn-1一定構成了子問題 1,2,....n-1在容量C時的最優解。

public static int MaxValue(int[] c, int[] v, int n, int capacity){//c數組代表體積,v數組代表價值,n代表商品個數,S代表背包體積int max = 0;int[][] table = new int[n+1][capacity+1];for(int i=0; i<n; i++){for(int k=0; k<capacity; k++){table[i][k] = 0;}}for(int i=1; i<=n; i++){for(int k=1; k<=capacity; k++){if(c[i-1] > k){table[i][k] = table[i-1][k];}else {table[i][k] = max(table[i-1][k], table[i-1][k-c[i-1]]+v[i-1]);}}}return table[n][capacity];}

參考:http://www.cnblogs.com/bourbon/archive/2011/08/23/2151044.html

筆試編程題必殺技——動態規劃

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.