目次
動的プログラミングを学ぶにはどうすればよいですか?
動的プログラミングの学習はもちろん、アルゴリズムの学習にも近道はありません。
動的プログラミング アルゴリズムに関する質問を私と一緒に解決し、動的プログラミングを一緒に学びましょう!
1. トピック分析
トピックリンク: 53. サブ配列の最大合計 - LeetCode
内容は分かりやすく、名前の通り部分配列の合計の最大値を求めるというものです。
2. アルゴリズム原理
1. ステータス表現
位置 dp[ i ] は、位置 i の要素で終わるすべての部分配列の最大合計を表します。
2. 状態遷移方程式
状態遷移方程式には 2 つのケースがあります。
1. 部分配列の長さが 1 の場合、合計の最大値は位置 i の値になります。
2. サブ配列の長さが 1 より大きい場合、最大合計は、前の位置 + 現在の位置の値の最大合計になります。
これで状態遷移方程式が得られます
dp [ i ] = max( nums[ i ],dp[ i ] + nums[ i ] )
3. 初期化
初期化は範囲外を防ぐためのものであり、後続の値には影響しません。
0に初期化するだけです。
4.注文の実行
左から右に進むだけです。
5. 戻り値
dp テーブル全体の最大値を返します。
3. コードの書き方
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int n = nums.size();
vector<int> dp(n + 1);
int ans = INT_MIN;
for(int i = 1; i <= n ; i++) {
dp[i] = max(nums[i - 1], dp[i - 1] + nums[i - 1]);
ans = max(ans, dp[i]);
}
return ans;
}
};
最後に次のように書きます。
以上が今回の記事の内容となります、読んでいただきありがとうございます。
何かを得たと感じたら、ブロガーに「いいね! 」を与えることができます。
記事の内容に抜けや間違いがある場合は、ブロガーにプライベートメッセージを送信するか、コメントエリアで指摘してください〜