53. Maximum Subarray動態規劃求解最大子串問題
阿新 • • 發佈:2019-02-08
問題描述:
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [-2,1,-3,4,-1,2,1,-5,4]
,
the contiguous subarray [4,-1,2,1]
has the largest sum = 6
.
問題分析:
前面我已經通過暴力求解和分治演算法求出解,這次我用動態規劃來分析這個問題。當第一次拿到這個問題的時候,我嘗試著建立狀態方程,dp[i]表示的是以i為結尾的前i個子串的最大和,那麼對於dp[i-1],如果num[i]>0,則直接將其加入到子串中,如果num[i]<0,則沒必要將之加入進來。
狀態轉移方程:dp[i]=num[i]>0?dp[i-1]+num[i]:dp[i-1]
最終求出dp[len.(array)]即可。dp[0]=num[0]。後來發現寫完程式,是錯誤的,這是因為即便num[i]<0,但是它依然可能有資格進入到子串中的,所以狀態的轉移方程是出錯的,那麼需要重新構造這個方程。若dp[i-1]<0,那麼這個子串相當於是累贅,不需要再加上他。如果dp[i-1]>=0,那麼這個子串就為求和做出了正貢獻。所以新的轉移方程如下:
狀態轉移方程:dp[i]=dp[i-1]>0:dp[i-1]+num[i]:num[i]。
程式碼:
int maxSubArray(vector<int>& nums) { int *dp=new int[nums.size()]; dp[0]=nums[0]; int max=nums[0]; for(int i=1;i<nums.size();i++){ dp[i]=dp[i-1]>0?dp[i-1]+nums[i]:nums[i]; if(dp[i]>max){ max=dp[i]; } } return max; }