LeetCode · 毎日の質問 · 1186. 部分配列の最大合計を取得するには、1 回削除します · 動的プログラミング

著者: Xiao Xun
リンク: https://leetcode.cn/problems/maximum-subarray-sum-with-one-deletion/solutions/2321919/dong-tai-gui-hua-zhu-shi-chao-ji-xiang- x-cwvs/
出典: LeetCode の著作権は
作者に帰属します。商業的転載の場合は著者に連絡して承認を求め、非商業的転載の場合は出典を明記してください。

トピック

 

 

一連の考え

タイトル -> 配列を指定すると、最大 1 つの任意の要素を削除し、部分配列の最大合計を返すことができます。

dp[arrSize][2] を定義します

  • dp[i][0]は現在の要素arr[i]の最大和を選択することを意味し、dp[i][1]は要素の最大和を削除することを意味します。
  • 質問の意味では 1 つの要素が含まれている必要があるため、dp[0][0] = arr[0]、dp[0][1] = 0 と初期化します。初期値には 1 つの要素が含まれている必要があります。 arr[0] のみです。最初は要素を削除し、合計は 0 でなければなりません。
  • 現在の位置の合計は前の位置の状態に依存する必要があるため、再帰方向は左から右でなければなりません
  • 漸化式:
    • dp[i][0] = MAX(dp[i-1][0], 0) + arr[i]; 前の位置の合計が 0 より小さい場合、現在の位置はサブ配列
    • dp[i][1] = MAX(dp[i-1][1] + arr[i], dp[i-1][0]); 要素の削除は、現在の要素の削除と要素の削除に分けられます。サブ配列その他の要素、dp[i-1][0] は現在の要素を削除することを意味し、dp[i-1][1] + arr[i] は他の要素を削除することを意味します
  • 各ステップの最大値を保存

コードコメントは非常に詳細です

コード


#define MAX(a, b) ((a) > (b) ? (a) : (b))
int maximumSum(int* arr, int arrSize) {
    int max = arr[0];
    int dp[arrSize][2];
    dp[0][0] = arr[0];
    dp[0][1] = 0;//初始化
    for (int i = 1; i < arrSize; i++) {
        dp[i][0] = MAX(dp[i-1][0], 0) + arr[i];//选择当前位置
        dp[i][1] = MAX(dp[i-1][1] + arr[i], dp[i-1][0]);//删除一个元素
        max = MAX(max, MAX(dp[i][0], dp[i][1]));//取每一个子数组最大值
    }
    return max;
}


作者:小迅
链接:https://leetcode.cn/problems/maximum-subarray-sum-with-one-deletion/solutions/2321919/dong-tai-gui-hua-zhu-shi-chao-ji-xiang-x-cwvs/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

おすすめ

転載: blog.csdn.net/m0_64560763/article/details/131410943