動態規劃 最大子陣列

2021-06-29 01:58:55 字數 916 閱讀 2602

解題思路:

對於這樣乙個連續和的問題(個人習慣叫做最大連續和),如果我們要用動態規劃來解,首先得考慮狀態和狀態轉移方程。如果我們把題述陣列看成序列,那麼是不是可以用序列dp來考慮呢?

我們不妨考慮乙個這樣的序列:1,-3,5,-2,4

a[i]表示這個序列的第 i 個元素,dp[i]表示最後乙個元素是a[i]的最大連續和(此乃狀態,是不是跟lis的dp解法有點類似),於是:

dp[0] : a[0] ; ( 1 )

dp[1] : max(dp[0] + a[1] , a[1]) ; ( -2 )

dp[2] : max(dp[1] + a[2] , a[2]) ; ( 5 )

dp[3] : max(dp[2] + a[3] , a[3]) ; ( 3 )

dp[4] : max(dp[3] + a[4] , a[4]) ; ( 7 )

所以:ans = 7 (dp陣列的最大值)

於是,我們可以得到狀態轉移方程:dp[i+1] = max(dp[i]+a[i+1] , a[i+1])

寫成**的話,我們可以忽略掉dp陣列,直接用乙個變數sum來記錄 i 之前的最大增量(因為如果這個增量為負,則變為0)

wikioi 3155

#include 

#define inf 0x3f3f3f3f

using namespace std;

int n,ans,sum,a[1000005];

int main()

printf("%d\n",ans);

}return

0;}

總結:

果然動規很強啊。。。。

最大子陣列問題 動態規劃

昨天偶然上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 ...

動態規劃 最大子陣列 1

1.問題描述 最大子陣列 2.思路 參考 lintcode maximum subarray iii 假設給定陣列共有n個元素,需要找到k個不重合的子陣列使其和最大。令符號 i,j 表示在陣列前i個元素中找到j個不重合的和最大的子陣列的和,符號 a,b 表示在子陣列nums a,a 1,b 中找到乙...