演算法 連續子陣列的最大和 c 動態規劃

2021-10-12 05:50:12 字數 966 閱讀 2014

演算法思路:

狀態定義:

設動態規劃列表 dp ,dp[i] 代表以元素 nums[i] 為結尾的連續子陣列最大和。

轉移方程:

若dp[i−1]≤0 ,說明 dp[i−1] 對dp[i] 產生負貢獻,即 dp[i−1]+nums[i] 還不如 nums[i] 本身大。

當 dp[i−1]>0 時:執行 dp[i]=dp[i−1]+nums[i] ;

當 dp[i−1]≤0 時:執行 dp[i]=nums[i] ;

初始狀態: dp[0]=nums[0],即以nums[0]結尾的連續子陣列最大和為nums[0] 。

返回值:返回dp 列表中的最大值,代表全域性最大值。

空間複雜度降低:

由於dp[i] 只與dp[i−1] 和nums[i] 有關係,因此可以將原陣列nums 用作dp 列表,即直接在nums 上修改即可。

由於省去dp 列表使用的額外空間,因此空間複雜度從 o(n) 降至 o(1) 。

**實現:

#include

#include

#include

#include

//using namespace std;

void main() ;

int size = sizeof(nums) / sizeof(nums[0]);

for (int i = 1; i < size; i++)

if (nums[i - 1] > 0) nums[i] = nums[i] + nums[i - 1];

cout << max(nums.begin(), nums.end()) << endl;

}複雜度分析:

時間複雜度 o(n): 線性遍歷陣列 nums即可獲得結果,使用o(n) 時間。

LeetCode連續子陣列的最大和 動態規劃

輸入乙個整型陣列,陣列裡有正數也有負數。陣列中的乙個或連續多個整數組成乙個子陣列。求所有子陣列的和的最大值。要求時間複雜度為o n 輸入 nums 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。1 arr.length 10 5,100 arr i...

leetcode 連續子陣列的最大和(動態規劃)

題目描述 輸入乙個整型陣列,陣列裡有正數也有負數。陣列中的乙個或連續多個整數組成乙個子陣列。求所有子陣列的和的最大值。要求時間複雜度為o n 示例1 輸入 nums 2,1,3,4,1,2,1,5,4 輸出 6解釋 連續子陣列 4,1,2,1 的和最大,為 6 實現 def maxsubarray ...

動態規劃 連續子陣列的最大和

使用動態規劃 f i 以array i 為末尾元素的子陣列的和的最大值,子陣列的元素的相對位置不變 f i max f i 1 array i array i res 所有子陣列的和的最大值 res max res,f i 如陣列 6,3,2,7,15,1,2,2 初始狀態 f 0 6 res 6 ...