件名の説明:
あなたは、家の通りの計画を盗むためにプロの泥棒です。同じ夜上の2つの隣接する家は、泥棒がシステムに侵入した場合の各部屋にはいくつかの現金を所持している、影響を与える唯一の制約は、相互に通信し、あなたの隣人の家は、盗難防止システムが装備されて盗む自動的に警報。
もし警報装置に触れていない場合に算出ハウジングストレージ量の各非負整数のアレイからの代表与え、に最大量を盗むことができます。
実施例1: 入力:[1,2,3,1] 出力:4 説明:ハウジング盗難番号1(量= 1)、次いで盗難ハウジング3(量= 3)。 盗難= 3 + 1 = 4の最大量。 実施例2: 入力:[2,7,9,3,1] 出力:12 説明:ハウジング盗難番号1(量= 2)、3盗難ハウジング(量= 9)、盗難続いハウジング5(1 =金額)。 盗難= 2 + 9 + 1 = 12に最大量。
アイデアの分析:動的プログラミング
動的プログラミング式:DP [N] = MAX( DP [N-1]、DP [N-2] + NUM)
に隣接するハウジング、ハウジングの位置N最大電流利用可能な盗難を破壊しないので、又はn-1は、盗難の最大収容可能であり、またはN-2は最大プラス盗難ハウジング電流値を収容可能であり、最大値はその間にかかる
例:そのような入力[3,4,2を]
1つの部屋の盗難[2] = 4,3番2は、部屋自体の値であるNUM = 2、[1] = 1,3,2号室の盗難4 DPの最大値である3 DPの最大値であります次いで、[3] DP = MAX(DP [2]、DP [1] + NUM)= MAX(4、+ 2 3)盗難5,3部屋の最大数= 5
クラスソリューション{ ロブint型のpublic static(INT [] NUMS){ int型のlen = nums.length。 IF(LEN == 0){ 戻り0; } INT [] DP = [lenの+ 1]新しいINT。 DP [0] = 0; DP [1] = NUMS [0]。 {(; I <= LEN I ++ INT I = 2)のための 、DP [I] = Math.max([ - 1 - I]、DP [I 2] + NUMS [I-1] DP) } [LEN] DP返します。 } }
時間の複雑さ:O(n)は、
宇宙複雑:O(n)は、