摘要:概要本文只是簡單的介紹動態規劃遞歸非遞歸算法實現案例一題目一求數組非相鄰最大和題目描述在一個數組中,找出一組不相鄰的數字,使得最后的和最大。
概要
本文只是簡單的介紹動態規劃遞歸、非遞歸算法實現
案例一 題目一:求數組非相鄰最大和[題目描述]
在一個數組arr中,找出一組不相鄰的數字,使得最后的和最大。
[示例輸入]
arr=1 2 4 1 7 8 3
[示例輸出]
15
from functools import wraps def memoDeco(func): """ memoDeco主要是緩存已遍歷的節點,減少遞歸內存開銷 """ cashe={} @wraps(func) def wrapper(*args): if args not in cashe: cashe[args]=func(*args) return cashe[args] return wrapper @memoDeco def recMaxArray(array,index): if index==0: return array[0] elif index==1: return max(array[0],array[1]) else: return max(recMaxArray(array,index-2)+array[index],recMaxArray(array,index-1)) if __name__=="__main__": array=(1,2,4,1,7,8,3) print(recMaxArray(array,len(array)-1))非遞歸實現
def dpMaxArray(array): """ 代碼講解詳見引用一:正月點燈籠講解 """ lens=len(array) maxArray=[0]*(lens) maxArray[0]=array[0] maxArray[1]=max(array[0],array[1]) for i in range(2,lens): maxArray[i]=max(maxArray[i-2]+array[i],maxArray[i-1]) return maxArray[-1] if __name__=="__main__": array=(1,2,4,1,7,8,3) print(dpMaxArray(array))案例二
[題目描述]
給定一個正整數s, 判斷一個數組arr中,是否有一組數字加起來等于s。
[示例輸入]
arr=3 34 4 12 5 3
s=9
[實例輸出]
true
from functools import wraps #和第一題一樣,套用裝飾器可以做一個緩存節點作用 def memoDeco(func): """ memoDeco主要是緩存已遍歷的節點,減少遞歸內存開銷 """ cashe = {} @wraps(func) def wrapper(*args): if args not in cashe: cashe[args] = func(*args) return cashe[args] return wrapper @memoDeco def recSubSet(arr, index, tar_num): if index == 0: return arr[0] == tar_num elif tar_num == 0: return True elif arr[index] > tar_num: return recSubSet(arr, index - 1, tar_num) else: return recSubSet(arr, index - 1, tar_num) or recSubSet(arr, index - 1, tar_num - index) if __name__ == "__main__": arr = (3, 34, 4, 12, 5, 3) tar_num = 13 index = len(arr) - 1 print(recSubSet(arr, index, tar_num))非遞歸實現
""" 多維數組構建用python第三方庫numpy比較方便 代碼講解詳見引用一:正月點燈籠講解 """ import numpy as np def dpSubSet(arr, tar_num): subSet = np.zeros((len(arr), tar_num + 1), dtype=bool) subSet[:, 0] = True subSet[0, :] = False subSet[0, arr[0]] = True for i in range(1, len(arr)): for j in range(1, tar_num + 1): if arr[i] > j: subSet[i, j] = subSet[i - 1, j] else: subSet[i, j] = subSet[i - 1, j] or subSet[i - 1, j - arr[i]] return subSet[-1, -1] if __name__ == "__main__": arr = (3, 34, 4, 12, 5, 3) tar_num = 13 print(dpSubSet(arr, tar_num))引用
1,正月點燈籠-動態規劃
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/44559.html
摘要:代碼實現見下面評論對應代碼動態規劃基本思想和分治法基本思想有共同的地方,不同的是子問題往往不是獨立的,有事母問題要借助子問題的解來判斷,因此把已經計算好的問題記錄在表格中,后續如果需要查詢一下,可以避免重復計算,這是動態規劃的基本思想。 作者:心葉時間:2018-05-01 19:28 本文對應github地址:https://github.com/yelloxing/... 以上實現...
摘要:這是一個簡單的遞歸函數,你可以使用它來生成數列中指定序號的數值這個函數的問題在于它的執行效率非常低有太多值在遞歸調用中被重新計算。 本章內容銜接上一章 數據結構與算法:二分查找 內容提要 兩種基本數據結構: 數組 常見操作: 數組降維、數組去重 鏈表 遞歸:遞歸是很多算法都使用的一種編程方法 - 如何將問題分成基線條件和遞歸條件 - 分而治之策略解決棘手問題 ...
摘要:這是一個簡單的遞歸函數,你可以使用它來生成數列中指定序號的數值這個函數的問題在于它的執行效率非常低有太多值在遞歸調用中被重新計算。 本章內容銜接上一章 數據結構與算法:二分查找 內容提要 兩種基本數據結構: 數組 常見操作: 數組降維、數組去重 鏈表 遞歸:遞歸是很多算法都使用的一種編程方法 - 如何將問題分成基線條件和遞歸條件 - 分而治之策略解決棘手問題 ...
摘要:動態規劃法用表示最大子數組的結束下標為的情形,則對于,有這樣就有了一個子結構,對于初始情形,遍歷就能得到這個數組,其最大者即可最大子數組的和。動態規劃法想法巧妙,運行效率也高,但是沒有普遍的適用性。 問題簡介 ??本文將介紹計算機算法中的經典問題——最大子數組問題(maximum subarray problem)。所謂的最大子數組問題,指的是:給定一個數組A,尋找A的和最大的非空連續...
摘要:程序員小吳打算使用動畫的形式來幫助理解遞歸,然后通過遞歸的概念延伸至理解動態規劃算法思想。因此,分治策略一般用來解決子問題相互對立的問題,稱為標準分治,而動態規劃用來解決子問題重疊的問題。難點就在于找出動態規劃中的這三個概念。 在學習「數據結構和算法」的過程中,因為人習慣了平鋪直敘的思維方式,所以「遞歸」與「動態規劃」這種帶循環概念(繞來繞去)的往往是相對比較難以理解的兩個抽象知識點。...
閱讀 3482·2021-11-19 09:40
閱讀 1499·2021-10-13 09:41
閱讀 2673·2021-09-29 09:35
閱讀 2718·2021-09-23 11:21
閱讀 1711·2021-09-09 11:56
閱讀 838·2019-08-30 15:53
閱讀 852·2019-08-30 15:52
閱讀 605·2019-08-30 12:47