作者:小迅
链接: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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。