1. 【問題描述】 最大子陣列|||
2. 【思路】 參考:lintcode:maximum subarray iii
假設給定陣列共有n個元素,需要找到k個不重合的子陣列使其和最大。令符號(i, j)表示在陣列前i個元素中找到j個不重合的和最大的子陣列的和,符號[a,b]表示在子陣列nums[a,a+1,...,b]中找到乙個最大子陣列,返回最大子陣列的和。則有:
(i, j)=max
下面以n=6,k=4為例具體說明.首先構建二維陣列dpk
(1,1)
(2,1) (2,2)
(3,1) (3,2) (3,3)
(4,2) (4,3) (4,4)
(5,3) (5,4)
(6,4)
(6,4)即為所求.根據(i, j)的表示式可以寫出:
(1,1)=nums[0];
(2,2)=(1,1)+[2,2];
(3,2)=max;
(4,2)=max;
(3,3)=(2,2)+[3,3];
(4,3)=max;
(5,3)=max;
觀察(2,2)與(3,2)的表示式可以發現:(2,2)=(1,1)+[2,2]<=(1,1)+[2,3],所以(3,2)的表示式可以改寫為:
(3,2)=max;
同理可以改寫後面的表示式。基於此可以改寫(i, j)的表示式:
(i, j)=max
觀察上述(1,1)到(5,3)的表示式發現,加粗部分重複出現,所以可以用乙個二維陣列儲存[a,b]的值避免重複計算.
下面的**中,過程maxbe(nums,beg,end,dp1)計算[beg,end],其中二維陣列dp1儲存[beg,end]的值避免重複計算
3. 【**】
class solution
if(beg==end)
int mid=beg+(end-beg)/2;
int i=mid-1,left=nums[mid],ls=left;
while(i>=beg)
int j=mid+2,right=nums[mid+1],rs=right;
while(j<=end)
int left_sum=maxbe(nums,beg,mid,dp1),mid_sum=left+right,right_sum=maxbe(nums,mid+1,end,dp1);
dp1[beg+1][end+1]=(left_sum>=right_sum?left_sum:right_sum)>=mid_sum?(left_sum>=right_sum?left_sum:right_sum):mid_sum;
return dp1[beg+1][end+1];
}int maxsubarray(vectornums, int k)
for(int j=2;j<=k;++j) //for
}//for
}//for
return dpk[n][k];
}};
動態規劃 最大子陣列
解題思路 對於這樣乙個連續和的問題 個人習慣叫做最大連續和 如果我們要用動態規劃來解,首先得考慮狀態和狀態轉移方程。如果我們把題述陣列看成序列,那麼是不是可以用序列dp來考慮呢?我們不妨考慮乙個這樣的序列 1,3,5,2,4 a i 表示這個序列的第 i 個元素,dp i 表示最後乙個元素是a i ...
最大子陣列問題 動態規劃
昨天偶然上csdn,看到這個問題,學習了一種複雜度為o n 的演算法,可以計算array的最大子陣列問題。思路就是從0 length,將array累加起來,同時用乙個變數max記錄最大值,如果sum max,就更新max,如果sum 0 就令sum 0 為什麼是這樣呢,sum 0的話,前面的就可以直...
動態規劃之最大子陣列
問題 乙個有n個整數元素的一位陣列 a 0 a 1 a n 1 a n 這個陣列當然有很多子陣列,那麼陣列之和的最大值是什麼呢?public class maxchildarray int sum new int numbers.length sum 0 numbers 0 for int i 1 ...