LEETCODEパンチDp記事

シンプルタイプ

1

70.階段を上る

階段を上っているとします。建物の最上部に到達するには、nステップかかります。

一度に1つまたは2つの階段を上ることができます。建物の最上部に登る方法はいくつありますか?

注:指定されたnは正の整数です。

例1:

入力:2
出力:2
説明:建物の上部に登る方法は2つあります。

  1. Tier 1 + Tier 1
  2. 2次の
    例2:

入力:3
出力:3
説明:建物の上部に登る方法は3つあります。
3.レベル1 +レベル1 +レベル1
4.レベル1 +レベル2
5.レベル2 +レベル1

class Solution {
    public int climbStairs(int n) {
        if(n<3)
        return n;
        int one = 1;
        int two = 2;
        int next = 0;
        for(int i=2;i<n;i++){
            next=one+two;
            one=two;
            two=next;
        }
        return next;
    }
}

2

198.自宅での戦闘

あなたはプロの泥棒で、通りに沿って家を盗むことを計画しています。各部屋には一定量の現金が隠されています。盗難に影響を与える唯一の制限要因は、隣接する家に相互接続された盗難防止システムが装備されていることです。2つの隣接する家が同じ夜にハッキングされた場合、システムは自動的に警察に通報します。

各家に保管されている金額を表す非負の整数配列を指定して、警報装置に触れずに盗むことができる最大量を計算します。

例1:

入力:[1,2,3,1]
出力:4
説明:家1の盗難(金額= 1)、次に家3の盗難(金額= 3)。
最大盗難金額= 1 + 3 = 4。
例2:

入力:[2,7,9,3,1]
出力:12
説明:家1の盗難(金額= 2)、家3の盗難(金額= 9)、次に家5の盗難(金額= 1)。
最大盗難金額= 2 + 9 + 1 = 12。

class Solution {
    public int rob(int[] nums) {
        if(nums.length==0)
        return 0;
        if(nums.length==1)
        return nums[0];
        int one = nums[0];
        int two = Math.max(nums[0],nums[1]);
        int next = Math.max(one,two);
        for(int i=2;i<nums.length;i++){
            next = Math.max(one+nums[i],two);
            one=two;
            two=next;
        }
        return next;
    }
}

213.家族の戦いII

あなたはプロの泥棒であり、通りに沿って家を盗む計画を立てています。各部屋には一定量の現金が含まれています。この場所にある家はすべて円になっています。つまり、最初の家と最後の家が隣り合っています。同時に、隣接する家には相互接続された盗難防止システムが装備されており、同じ夜に2つの隣接する家が泥棒に侵入された場合、システムは自動的に警察に通報します。

各家に保管されている金額を表す非負の整数配列を指定して、警報装置に触れずに盗むことができる最大量を計算します。

例1:

入力:[2,3,2]
出力:3
説明:隣接しているため、最初に家1(金額= 2)を盗み、次に家3(金額= 2)を盗むことはできません。
例2:

入力:[1,2,3,1]
出力:4
説明:最初に家1(量= 1)、次に家3(量= 3)を盗むことができます。
最大盗難金額= 1 + 3 = 4。

class Solution {
    public int rob(int[] nums) {
        int len = nums.length;
        if(len==0)
        return 0;
        if(len==1)
        return nums[0];
        int one1=nums[0];
        int two1=Math.max(nums[0],nums[1]);
        int next1=Math.max(one1,two1);
        for(int i=2;i<len-1;i++){
            next1=Math.max(one1+nums[i],two1);
            one1=two1;
            two1=next1;
        }
        int next2=nums[1];
        if(len>3){
          int one2=nums[1];
        int two2=Math.max(nums[1],nums[2]);
         next2=Math.max(one2,two2);
        for(int i=3;i<len;i++){
            next2=Math.max(one2+nums[i],two2);
            one2=two2;
            two2=next2;
        }
        }
        return Math.max(next1,next2);

    }
}

4

4つのオリジナル記事を公開 Likes0 Visits15

おすすめ

転載: blog.csdn.net/smile_study1/article/details/105612688