動態規劃 最大子陣列 1

2021-07-23 10:24:30 字數 1548 閱讀 3739

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 ...