1. 程式人生 > >53. Maximum Subarray動態規劃求解最大子串問題

53. Maximum Subarray動態規劃求解最大子串問題

問題描述:

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;
}