leetcode 213戦利品II:動的プログラミング(C ++)

  • leetcode 213戦利品II

    あなたが家の通りの計画を盗むためにプロの泥棒です、各部屋には、いくつかの現金を所持しています。この場所は、すべての家は最初と最後の家は家の隣にあることを意味し、円、です。同じ夜上の2つの隣接する家は、泥棒は、システムが自動的に警報に押し入った場合一方、盗難防止システムを備えた隣接する家は、互いに通信します。

    もし警報装置に触れていない場合に算出ハウジングストレージ量の各非負整数のアレイからの代表与え、に最大量を盗むことができます。

    例:

    入力:[2、3、2]

    出力:3

    説明:あなたが最初の第1ハウジング(量= 2)を盗み、それらが隣接しているので、その後、第三家(お金= 2)を盗むことはできません。

  • 分析

    問題はleetcode 198強盗巡回置換を用いて膨張、それは二段階で、タイトル198に基づいて修正されてもよいです。

    • 最初盗むではない:[1 .... N-1]からの最大値が得られます
    • 最初盗む:[0 ....、N-1]から最大値を求められます

    DPの特定のアイデア:

    1. ステータスと舞台デザイン:DP [i]は、私が得た家の前に最大値を示し
    2. 状態遷移:
      1. i番目は盗むしない場合:DP [I] = DPを[I - 1]
      2. ときにi番目盗む:DP [I] = DP [I - 2] + NUMS [I]
      3. 私が目に分析すると、我々は最初のiを知らない - 盗まれた場合は1家:それは注目に値するです。
        1. ときに最初のi - 1つのファミリーが盗まれていなかった場合、DPは[I] = DP [I - 1] + NUMS [i]は、今回のDP [I - 1] = DP [I - 2]、DPを取得するために[ I] = DP [I - 2] + NUMS [I]
        2. 最初のi場合 - 1家が盗まれた、DP [I] = DP [I - 1] + NUMS [i]が望ましくない、すなわち、DP [I] = DP [I - 1]
      4. 転送合計式:DP [I] = MAX(DP [I - 1]、DP [I - 2] + NUMS [i])と
    3. 国境:[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;
        }
    };

おすすめ

転載: www.cnblogs.com/joe-w/p/12325439.html