leetcode152題之動態規劃

2021-10-02 22:24:44 字數 1792 閱讀 5315

動態規劃

動態規劃(dynamic programming)是運籌學的乙個分支,是求解決策過程(decision

process)最優化的數學方法。20世紀50年代初美國數學家r.e.bellman等人在研究多階段決策過程(multistep

decision process)的優化問題時,提出了著名的最優化原理(principle of

optimality),把多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解,創立了解決這類過程優化問題的新方法——動態規劃。2023年出版了他的名著《dynamic

programming》,這是該領域的第一本著作。

個人理解動態規劃是尋求最優解的乙個很好的辦法,將乙個大的問題分解成小的問題,然後求解。

題目給定乙個整數陣列 nums ,找出乙個序列中乘積最大的連續子串行(該序列至少包含乙個數)。

示例 1:

輸入: [2,3,-2,4]

輸出: 6

解釋: 子陣列 [2,3] 有最大乘積 6。

示例 2:

輸入: [-2,0,-1]

輸出: 0

解釋: 結果不能為 2, 因為 [-2,-1] 不是子陣列。

分析這道題的關鍵點在於連續,我們可以遍歷陣列,取當前元素與之前的積作積和當前元素做比較,取其大值,抽象成函式:f(x) = max(re * x,x);

儘管此處分析出了關鍵,但上面的題仍有難度,我們將上面的題簡化下,我們不考慮負數的情況了,但是需要考慮分數的情況(不然此題沒有意義了)。

**實現

/**

* 求非負集合的最大連續積序列

* @param arr

* @return

*/public

double

maxnolesszero

(double

arr)

return max;

}

剛才在上面我們已經抽象出了函式f(x) = max(f(x-1) * x,x)了,要找到最大的序列積,只需要求出max(f(x))即可了。

現在我們來求最開始的那道題的解了,那道題與上面**實現的題有兩個差異:

集合是整數集合,不存在分數

集合元素可以為負

問題的關鍵點在於處理負數,假設當前元素為負,那麼他的前乙個元素的序列積的最小值與其相乘才能獲得最大積,所以不僅要記錄當前元素的最大連續序列積,還要同時記錄當前元素的最小連續序列積。

**實現

/**

* 求最大序列的積

* @param arr

* @return

*/public

intmax

(int

arr)

currmax = math.

max(currmax * arr[i]

,arr[i]);

currmin = math.

min(currmin * arr[i]

,arr[i]);

max = math.

max(currmax,max);}

return max;

}

上面的**故意沒寫特別詳細的注釋,目的是讓你自己細細體會,因為演算法題的重點是理解其思想,哪怕是忘了,以後再看也能很快想起來其思想,至於其細節只要不斷除錯就好了。

動態規劃 leetcode 152 乘積最大子陣列

乘積最大子陣列 給你乙個整數陣列 nums 請你找出陣列中乘積最大的連續子陣列 該子陣列中至少包含乙個數字 示例 1 輸入 2,3,2,4 輸出 6 解釋 子陣列 2,3 有最大乘積 6。示例 2 輸入 2,0,1 輸出 0 解釋 結果不能為 2,因為 2,1 不是子陣列。乘積最大子陣列,與最大子序...

LeetCode 152題 乘積最大子串行

示例 輸入 2,3,2,4 輸出 6 解釋 子陣列 2,3 有最大乘積 6,返回為6。思路 動態規劃 定義陣列 dpmax i 表示以第i個元素結尾的子陣列中乘積最大的值,這個陣列必須包含第i個元素 對於 dpmax i 有三種取值 1.nums i 0 且 dpmax i 1 0 則 dpmax ...

Leetcode 152每日一題 乘積最大子陣列

中等難度題目 給你乙個整數陣列nums,請你找出陣列中乘積最大的連續子陣列 該子陣列中至少包含乙個數字 並返回該子陣列所對應的乘積。輸入 2,3,2,4 輸出 6解釋 子陣列 2,3 有最大乘積 6。思路 max2 記錄每乙個元素為截止的子陣列乘積的最大最小,1 當前數 a i 為正,則最大值為 i...