-
あなたが家の通りの計画を盗むためにプロの泥棒です、各部屋には、いくつかの現金を所持しています。この場所は、すべての家は最初と最後の家は家の隣にあることを意味し、円、です。同じ夜上の2つの隣接する家は、泥棒は、システムが自動的に警報に押し入った場合一方、盗難防止システムを備えた隣接する家は、互いに通信します。
もし警報装置に触れていない場合に算出ハウジングストレージ量の各非負整数のアレイからの代表与え、に最大量を盗むことができます。
例:
入力:[2、3、2]
出力:3
説明:あなたが最初の第1ハウジング(量= 2)を盗み、それらが隣接しているので、その後、第三家(お金= 2)を盗むことはできません。
分析
問題はleetcode 198強盗巡回置換を用いて膨張、それは二段階で、タイトル198に基づいて修正されてもよいです。
- 最初盗むではない:[1 .... N-1]からの最大値が得られます
- 最初盗む:[0 ....、N-1]から最大値を求められます
DPの特定のアイデア:
- ステータスと舞台デザイン:DP [i]は、私が得た家の前に最大値を示し
- 状態遷移:
- i番目は盗むしない場合:DP [I] = DPを[I - 1]
- ときにi番目盗む:DP [I] = DP [I - 2] + NUMS [I]
- 私が目に分析すると、我々は最初のiを知らない - 盗まれた場合は1家:それは注目に値するです。
- ときに最初のi - 1つのファミリーが盗まれていなかった場合、DPは[I] = DP [I - 1] + NUMS [i]は、今回のDP [I - 1] = DP [I - 2]、DPを取得するために[ I] = DP [I - 2] + NUMS [I]
- 最初のi場合 - 1家が盗まれた、DP [I] = DP [I - 1] + NUMS [i]が望ましくない、すなわち、DP [I] = DP [I - 1]
- 転送合計式:DP [I] = MAX(DP [I - 1]、DP [I - 2] + NUMS [i])と
- 国境:[0] = 0は、フロントグラブ0 0存在しないの境界線DPを追加します。
コードの実装
入力配列の長さを考慮すると、ここで、0を得ることに注意してください
class Solution { public: int rob(vector<int>& nums) { int n = nums.size(); if(n == 0) return 0; //int ans=0; int dp[n + 1]; dp[0] = 0; //第0间 //不偷第一间 dp[1] = 0; int ans = nums[0]; for(int i = 2; i <= n; ++i) { dp[i] = max(dp[i - 2] + nums[i - 1], dp[i - 1]); ans = max(ans, dp[i]); } //偷第一间 dp[1] = nums[0]; for(int i = 2; i < n; ++i) { dp[i] = max(dp[i - 2] + nums[i - 1], dp[i - 1]); ans = max(ans, dp[i]); } return ans; } };
leetcode 213戦利品II:動的プログラミング(C ++)
おすすめ
転載: www.cnblogs.com/joe-w/p/12325439.html
ランキング