leetcodeの動的プログラミング閾値質問詳細な分析()

1.最小コスト階段
https://leetcode-cn.com/problems/min-cost-climbing-stairs/

答えを公式のアイデアのように問題のギャングスター・ソリューション、(自分のプラス脚注)

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        int c1 = cost[0];
        int c2 = cost[1];
        int N = cost.size();
        for (int i = 2; i < N; ++i) {
            int c3 = min(c1, c2) + cost[i]; 
            //从i = 2开始,本层的体力加上min(到达第i - 2层花费体力的最小值,到达第i - 1层花费体力的最小值)
            c1 = c2; 
            //c1为到达第i - 1层花费体力的最小值
            c2 = c3; 
            //c2为到达第i层花费体力的最小值
        }
        return min(c1, c2);
         //比较到N - 1和N - 2花费体力的值
    }
};

著者:DA-LI-王
リンクします。https://leetcode-cn.com/problems/min-cost-climbing-stairs/solution/c-dong-tai-gui-hua-ti-jie-by-da-li -Wang-3 /
ソース:滞在ボタン(LeetCode)
の著作権は著者が保有します。著者は認可商業転載してください接触、非商用の転載は、ソースを明記してください。

この問題を解決するよりよく理解ギャング

class Solution{
	public:
		int minCostClimbingStairs(vector<int>& cost) {
			int num=cost.size();
			for(int i=2;i<num;++i)cost[i]+=min(cost[i-1],cost[i-2]);
			return min(cost[num-1],cost[num-2]);
	    }
}; 

著者:yzwz
リンクします。https://leetcode-cn.com/problems/min-cost-climbing-stairs/solution/xiang-dang-yu-yi-ge-fei-bo-na-qi-shu-lie-by -yzwz /
ソース:滞在ボタン(LeetCode)
著者によって予約の著作権。著者は認可商業転載してください接触、非商用の転載は、ソースを明記してください。

2.戦利品
https://leetcode-cn.com/problems/house-robber/
問題第ギャングに対する解決策を参照するに、特定の分析(魂が手をペイント)問題の解

考え
タグ:動的プログラミング
、動的プログラミング式:DP [N] = MAX( DP [N-1]、DP [N-2] + NUM)
に隣接するハウジングを破壊しないので、ハウジングは、nの現在の位置にあってもよいです最大盗難、またはN-1は、盗難の最大収容可能であり、またはN-2の最大プラス盗難ハウジング電流値を収容可能であり、最大値はその間にかかる
1室:例盗難33 DPの最大値である[1] = 3,2部屋番号の盗難44 DPの最大値[2] = 4,3番22は、DP、部屋自体NUM = 2の値である[3 = MAX(DP [2] 、DP [1] + NUM)= MAX(4、3 + 2)= 盗難の最大数5,3客室55
時間計算:O(N)O(N )、 nnは配列の長さであります

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

著者:guanpengchnの
リンクします。https://leetcode-cn.com/problems/house-robber/solution/hua-jie-suan-fa-198-da-jia-jie-she-by-guanpengchn/
出典:滞在ボタン( LeetCode)
の著作権は著者が保有します。著者は認可商業転載してください接触、非商用の転載は、ソースを明記してください。

私はAを見ていないC ++で書かれてきました

class Solution {
public:
    int rob(vector<int>& nums) {
        int len = nums.size();
        if(len == 0)
            return 0;
        if(len == 1)
            return nums[0];
		//nums[1] = max(nums[0], nums[1]);
        for(int i = 2; i < len; i++){
            nums[i] = max(nums[i] + nums[i - 2], nums[i - 1]);
        }
        return max(nums[len - 1], nums[len - 2]);
    }
};

フレーズがコメントを追加していないため、入力されていませんでした:[2,1,1,2]正しい出力:4
彼らはまだ兄を見て

3.除数ゲーム
https://leetcode-cn.com/problems/divisor-game/
(問題の解決策を見ていないとき、彼らは唯一のアリスを考えるNは= KX、xが等しくない場合は、彼女が勝つことができるNxの3つの非プライム時間を作ります1、N - X =(k - 1 )X = N 'N' 素数にすることはできません)

自分の言葉(言語クラス・ルーチン)における誘導集計の最初の首長で問題を解決するに
は1.アリスは2勝1つの失われたアカウントを占め、
アリスはたったの約現在奇数、奇数の場合は2次は偶数でなければならないように、または、奇数1である;
3.アリス電流が偶数の場合、数が偶数偶数で約奇数が1であってもよいことができ、このように直接マイナス1は、次の奇数、即ち、ボブですGETは奇数でなければならない、アリスは偶数を取得する必要があり、それは2に削減されています。

したがって、その後も勝つ、失うことが奇数であります

class Solution:
    def divisorGame(self, N: int) -> bool:
        target = [0 for i in range(N+1)]
        target[1] = 0 #若爱丽丝抽到1,则爱丽丝输
        if N<=1:
            return False
        else:
        
            target[2] = 1 #若爱丽丝抽到2,则爱丽丝赢
            for i in range(3,N+1):
                for j in range(1,i//2): #没学过爬虫,意思应该是从1到i的根号(?),j代表x
                    # 若j是i的余数且target[i-j]为假(0)的话,则代表当前为真(1)
                    if i%j==0 and target[i-j]==0: #鲍勃拿到i - j,而target[i - j] = 0代表失败,鲍勃失败爱丽丝的target[i] = 1
                        target[i] = 1
                        break
            return target[N]==1

著者:pandawakaka
リンクします。https://leetcode-cn.com/problems/divisor-game/solution/python3gui-na-fa-by-pandawakaka/
出典:滞在ボタン(LeetCode)
著者によって予約の著作権。著者は認可商業転載してください接触、非商用の転載は、ソースを明記してください。

4.分析配列
https://leetcode-cn.com/problems/is-subsequence/
ボー最初のダイナミックプログラミングのタイトルで書かれている、ではないが、動的計画法-

class Solution {
public:
    bool isSubsequence(string s, string t) {
        int len1 = s.length();
        long long len2 = t.length();
        long long ma = len2;
        for(int i = len1 - 1; i >= 0; i--){
            bool f = false;
            for(int j = ma - 1; j >= 0; j--){
                if(s[i] == t[j]){
                    ma = j;
                    f = true;
                    break;
                }  
            }
            if(f == false){
                return false;
            }
        }
        return true;
    }
};
リリース元の4件の記事 ウォンの賞賛0 ビュー42

おすすめ

転載: blog.csdn.net/weixin_44284194/article/details/104234772