最大子配列と――動的計画法
3518 ワード
1、前の方法をまとめる
前回の解の最も大きい子の配列は暴力の解法を求めて、すべての可能な子の配列と求めて、それから比較して最大の子の配列と、この方法も最も考えやすくて、プログラミングは比較的に容易で、興味のある学生は私の前の博客を見ることができます.
2、動的計画に基づく最大サブ配列の和を求める問題
暴力解の複雑さはO(n**3)であるため,確かに少し大きいが,動的計画法を用いて解くことができ,主な構想も簡単明瞭である.最大和サブ配列は2つの部分から構成されていると仮定する.1つは順方向とsumであり,もう1つは順方向とsumの次の要素であり,sumの値が0未満であると最大サブ配列の一部になることは不可能であるため,以前のsumを捨てなければならない.新しいsumを再定義します.このsumの開始要素は、前のsumとシーケンスの次の要素です.動的計画法は簡潔明瞭で,時間的複雑さはO(n)にすぎず,解の回数を減らした.
3、コードサンプル
前回の解の最も大きい子の配列は暴力の解法を求めて、すべての可能な子の配列と求めて、それから比較して最大の子の配列と、この方法も最も考えやすくて、プログラミングは比較的に容易で、興味のある学生は私の前の博客を見ることができます.
2、動的計画に基づく最大サブ配列の和を求める問題
暴力解の複雑さはO(n**3)であるため,確かに少し大きいが,動的計画法を用いて解くことができ,主な構想も簡単明瞭である.最大和サブ配列は2つの部分から構成されていると仮定する.1つは順方向とsumであり,もう1つは順方向とsumの次の要素であり,sumの値が0未満であると最大サブ配列の一部になることは不可能であるため,以前のsumを捨てなければならない.新しいsumを再定義します.このsumの開始要素は、前のsumとシーケンスの次の要素です.動的計画法は簡潔明瞭で,時間的複雑さはO(n)にすぎず,解の回数を減らした.
3、コードサンプル
arr = [1,-2,3,4,-5]
def fun(arr):
sum = arr[0]
max = 0
x = 0
y = 0
for i in range(1,len(arr)):
if sum >= 0:
sum += arr[i]
else:
sum = arr[i]
x = i
if sum > max:
max = sum
y = i
if x>y:
return arr[0:1]
else:
return arr[x:y+1]
if __name__=="__main__":
print(fun(arr))