日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

动态规划再理解(53、121、174)

發(fā)布時間:2023/12/10 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态规划再理解(53、121、174) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本次文檔也是對動態(tài)規(guī)劃的 再認識 。
之前寫過一些文章,在處理動態(tài)規(guī)劃問題的時候依據(jù)的思路是 :暴力搜索->加緩存->動態(tài)規(guī)劃。相關(guān)文章有:算法八——動態(tài)規(guī)劃,動態(tài)規(guī)劃——0-1背包問題,動態(tài)規(guī)劃——矩陣中的最短路徑長度等等。
最近在看問題的時候發(fā)現(xiàn),只要能明白暴力搜索是怎么搜索的,跟哪些條件有關(guān)系,不經(jīng)過前面2個步驟也能寫出動態(tài)規(guī)劃方程。大家知道動態(tài)規(guī)劃方程出來了,基本上問題就解決了。寫下文章記錄一下 。
如果看不出和哪些條件有關(guān)系,或者找不到動態(tài)轉(zhuǎn)換關(guān)系,還是要依據(jù)步驟一步一步來。

1 53. Maximum Subarray

輸入:int數(shù)組,有正有負
輸出:找到所有子數(shù)組的和,返回其中最大的。
規(guī)則:子數(shù)組是一個連續(xù)的數(shù)組,至少包含一個元素。
例如:
Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.

分析:對于任意一個元素nums[i],可以開啟一個子序列{nums[i]},也可以追加在前一個數(shù)字子序列的后面{…nums[i-1],nums[i]}。
對于開啟一個子序列的情況 ,子數(shù)組和=nums[i]。
對于追加的情況:目標(biāo)是要求子數(shù)組和,所以只要之前以nums[i-1]為結(jié)尾的子數(shù)組的和+nums[i]即可。假設(shè)dp[i]=以nums[i]為結(jié)尾的子數(shù)組的最大的和。
最后結(jié)果在所有dp元素中查找最大值。

dp[i] = Math.max(nums[i],nums[i+dp[i-1]])

動歸特征:與前一個元素相關(guān);與以前一個元素為結(jié)尾的子數(shù)組最大和相關(guān)。
之后就是寫代碼了。

class Solution {public int maxSubArray(int[] nums) {int n = nums.length;int[] dp = new int[n];dp[0] = nums[0];int max = dp[0];for(int i=1;i<n;i++){dp[i] = Math.max(nums[i],dp[i-1]+nums[i]);max = Math.max(max,dp[i]);}return max;} }

進一步空間優(yōu)化,可以自己思考。

2 121. Best Time to Buy and Sell Stock

輸入:int數(shù)組,表示每天的股價。
輸出:最大的盈利
規(guī)則:只可以買一次,賣一次。只能先買后賣。
例子:
Input: [7,1,5,3,6,4]
Output: 5
Explanation: 在價格為1的時候買入,在價格為6的時候賣出。
分析:只能買賣一次,先買后賣,說明是要找max(price[j]?price[i]),j>imax(price[j]-price[i]),j>imax(price[j]?price[i]),j>i。對于每一個j,只要找到min(price[i]),i=0,1...j?1min(price[i]),i=0,1...j-1min(price[i]),i=0,1...j?1即可。

class Solution {public int maxProfit(int[] prices) {int maxProfit = 0;int minPrice = Integer.MAX_VALUE;for(int i=0;i<prices.length;i++){minPrice = Math.min(minPrice,prices[i]);maxProfit = Math.max(maxProfit,prices[i]-minPrice);}return maxProfit;}}

總結(jié)

以上是生活随笔為你收集整理的动态规划再理解(53、121、174)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。