LeetCode·每日一题·1186. 删除一次得到子数组最大和·动态规划

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

题目

示例

思路

题意 -> 给定一个数组,可以删除最多一个任意元素,返回子数组最大和

定义dp[arrSize][2]

  • dp[i][0] 表示选择当前元素 arr[i] 的最大和,dp[i][1] 表示删除一个元素的最大和。
  • 由于题意要求必须包含一个元素,所以初始化 dp[0][0] = arr[0], dp[0][1] = 0, 初始值必须包含一个元素,所以只能是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