整数配列 nums を指定して、最大合計を持つ連続部分配列 (部分配列には少なくとも 1 つの要素が含まれます) を見つけて、その最大合計を返します。サブ配列は配列の連続した部分です。
例 1:
入力: nums = [-2,1,-3,4,-1,2,1,-5,4]
出力: 6
説明: 連続する部分配列の合計 [4,-1,2,1] が最大です、6です。
例 2:
入力: nums = [1]
出力: 1
例 3:
入力: nums = [5,4,-1,7,8]
出力: 23
動的プログラミング:
1. dp 配列 (dp テーブル) の添字の意味
dp[i]: 添字 i の前の最大の連続部分列の合計が dp[i] です。
2. 再帰式
dp[i] は 2 つの方向でのみ推定できます:
dp[i - 1] + nums[i]、つまり、nums[i] は現在の連続サブシーケンスと
nums[i] を結合します。最初から開始する 現在の連続サブシーケンスの合計の計算は
最大である必要があるため、 dp[i] = max(dp[i - 1] + nums[i], nums[i]); 3. dp の初期
化配列は
再帰式からわかります。dp[i] は dp[i - 1] に依存する状態であり、dp[0] は再帰式の基礎です。dp[i] の定義によれば、dp[0] = nums[0] となります。
4.
走査順序再帰式では、dp[i] は dp[i - 1] の状態に依存し、前から後ろに走査する必要があります。
def maxSubArray(nums):
dp = [0] * len(nums)
dp[0] = nums[0]
for i in range(1,len(nums)):
dp[i] = max(dp[i-1] + nums[i],nums[i])
return max(dp)
if __name__ == "__main__":
nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
print(maxSubArray(nums))
def maxSubArray(nums):
pre,result = 0, nums[0]
for el in nums:
pre = max(pre + el,el)
result = max(result,pre)
return result