【動的プログラミング学習】Jianzhi Offer II 091. 家にペンキを塗る (14)

目次

動的プログラミングを学ぶにはどうすればよいですか?

1. トピック分析

2. アルゴリズム原理

1. ステータス表現

2. 状態遷移方程式

3. 初期化

4.注文の実行

5. 戻り値

3. コードの書き方

最後に次のように書きます。


動的プログラミングを学ぶにはどうすればよいですか?

動的プログラミングの学習はもちろん、アルゴリズムの学習にも近道はありません。

動的プログラミング アルゴリズムに関する質問を私と一緒に解決し、動的プログラミングを一緒に学びましょう!

1. トピック分析

トピックリンク: Jianzhi Offer II 091. 家をペイントする - Leetcode

 この質問は複雑に見えますが、実際には理解するのは簡単です。

最初の例を見てみましょう。

ここには 3 つのサブ配列があり、隣接する 3 つの家を表します。

上記の数字は、さまざまな色をペイントするために必要なお金です。

そして、タイトルが私たちに尋ねているのは、すべての家を完成させるための最低コストです。

ここで条件があります。それは、隣接する 2 つの家を同じ色で塗装することはできないということです。 

2. アルゴリズム原理

1. ステータス表現

このトピックによれば、次の 3 つの状態表現を描画できます。

dp[ i ][ 0 ] は、位置 i にペイントするときに、最後の位置が赤でペイントされることを意味し、このときの最小コスト

dp[ i ][ 1 ] は、位置 i にペイントするときに、最後の位置が青でペイントされることを意味し、このときの最小コストは

dp[ i ][ 2 ] は、位置 i にペイントするときに、最後の位置が緑色にペイントされることを意味し、このときの最小コストは

2. 状態遷移方程式

したがって、状態遷移方程式も次の 3 つの状況から導出されます。

最後の家は赤を選択し、その最小コストは、青と緑を選択した前の家の最小コスト + 現在の家のコストです

他も同様です:

dp[ i ][ 0 ] = min( dp[ i - 1 ][ 1 ],dp[ i - 1 ][ 2 ] ) + コスト[ i ][ 0 ]

dp[ i ][ 1 ] = min( dp[ i - 1 ][ 0 ],dp[ i - 1 ][ 2 ] ) + コスト[ i ][ 1 ]

dp[ i ][ 2 ] = min( dp[ i - 1 ][ 0 ],dp[ i - 1 ][ 1 ] ) + コスト[ i ][ 2 ]

3. 初期化

範囲外を防ぎ、以下の値が間違ってしまうのを防ぐため、

実際には0を入力するだけです。

4.注文の実行

左から右に、3 つのフォームに同時に記入します

5. 戻り値

返回:min( dp[ n ][ 0 ],min( dp[ n ][ 1 ],dp[ n ][ 2 ] ) )

3. コードの書き方

class Solution {
public:
    int minCost(vector<vector<int>>& costs) {
        int n = costs.size();
        vector<vector<int>> dp(n + 1, vector<int>(3));
        for(int i = 1; i <= n; i++) {
            dp[i][0] = min(dp[i - 1][1], dp[i - 1][2]) + costs[i - 1][0];
            dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]) + costs[i - 1][1];
            dp[i][2] = min(dp[i - 1][0], dp[i - 1][1]) + costs[i - 1][2];
        }
        return min(dp[n][0], min(dp[n][1], dp[n][2]));
    }   
};

最後に次のように書きます。

以上が今回の記事の内容となります、読んでいただきありがとうございます。

何かを得たと感じたら、ブロガーに「いいね! 」を与えることができます。

記事の内容に抜けや間違いがある場合は、ブロガーにプライベートメッセージを送信するか、コメントエリアで指摘してください〜

おすすめ

転載: blog.csdn.net/Locky136/article/details/131734648