python |ダイナミックプログラミング

#エンコーディング:UTF-8
#トピックは:選択したARRの数字の束は、選択された数は、それに隣接していない、そして、選択された数の和と最大になり
NPとしてnumpyのインポート
ARR = [1,2,4,1,7,8,3]

#再帰的な言葉遣い
デフrec_opt(ARR、I):
	私== 0の場合:
		ARR戻る[0]
	elifのI == 1:
		戻りMAX(ARR [0]、ARR [1])
	#なぜここに隣接する2の最大のリターンはありますか?
	#これはまだ条件に反しありませんか?
	他:
		A = rec_opt(ARR、I-2)+ ARR [I]
		B = rec_opt(ARR、I-1)

	戻るMAX(A、B)

#非再帰的な書き込み
デフdp_opt(ARR):
	OPT = np.zeros(LEN(ARR))
	#ARRに等しい配列のサイズを作成し、そしてゼロで埋め
	オプト[0] =のARR [0]	
	オプト[1] = MAX(ARR [0]、[1] ARR)
	Iの範囲内の(2、LEN(ARR))のために:
		A = OPT [I-2] + ARR [I]
		B = OPT [I-1]
		オプト[I] = MAX(A、B)
	リターンのオプト[LEN(ARR)-1]
__name__ == "__main__" の場合:

	プリント(rec_opt(ARR、6))
	印刷(dp_opt(ARR))

  

#エンコード= UTF-8
#番号2の山があるかどうかを見つけるために、彼らはSを合計数に等しいです
ARR = [3,34,4,12,5,2]

デフ(ARR、I、S)rec_subset:
	== 0秒の場合:
		真を返します
	elifの私== 0:
		[0] == sのARR戻ります
	elifの[i]は> S ARR:
		リターンrec_shbset(ARR、I-1、S)
	他:
		= rec_subset(ARR、I-1、S-ARR [i])と
	#エンコーディング:UTF-8
#トピックは:選択したARRの数字の束は、選択された数は、それに隣接していない、そして、選択された数の和と最大になり
NPとしてnumpyのインポート
ARR = [1,2,4,1,7,8,3]

#再帰的な言葉遣い
デフrec_opt(ARR、I):
	私== 0の場合:
		ARR戻る[0]
	elifのI == 1:
		戻りMAX(ARR [0]、ARR [1])
	#なぜここに隣接する2の最大のリターンはありますか?
	#これはまだ条件に反しありませんか?
	他:
		A = rec_opt(ARR、I-2)+ ARR [I]
		B = rec_opt(ARR、I-1)

	戻るMAX(A、B)

#非再帰的な書き込み
デフdp_opt(ARR):
	OPT = np.zeros(LEN(ARR))
	#ARRに等しい配列のサイズを作成し、そしてゼロで埋め
	オプト[0] =のARR [0]	
	オプト[1] = MAX(ARR [0]、[1] ARR)
	Iの範囲内の(2、LEN(ARR))のために:
		A = OPT [I-2] + ARR [I]
		B = OPT [I-1]
		オプト[I] = MAX(A、B)
	リターンのオプト[LEN(ARR)-1]
__name__ == "__main__" の場合:

	プリント(rec_opt(ARR、6))
	印刷(dp_opt(ARR))

	B = rec_subset(ARR、I-1、S)
		AまたはBを返します
__name __ = "__ MAIN__" であれば	
印刷(rec_subset(編曲、LEN(ARR)-1,9-)

  

おすすめ

転載: www.cnblogs.com/chrysanthemum/p/11802264.html