解題思路:
對於這樣乙個連續和的問題(個人習慣叫做最大連續和),如果我們要用動態規劃來解,首先得考慮狀態和狀態轉移方程。如果我們把題述陣列看成序列,那麼是不是可以用序列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 中找到乙...