给你一个整数数组,返回它的某个 非空 子数组(连续元素)在执行一次可选的删除操作后,所能得到的最大元素总和。 换句话说,你可以从原数组中选出一个子数组,并可以决定要不要从中删除一个元素(只能删一次哦),(删除后)子数组中至少应当有一个元素,然后该子数组(剩下)的元素总和是所有子数组之中最大的。 注意,删除一个元素后,子数组 不能为空。 来源:力扣(LeetCode) 164 ms 33.2 MB
1. 题目
示例 1: 输入:arr = [1,-2,0,3] 输出:4 解释:我们可以选出 [1, -2, 0, 3],然后删掉 -2,这样得到 [1, 0, 3],和最大。 示例 2: 输入:arr = [1,-2,-2,3] 输出:3 解释:我们直接选出 [3],这就是最大和。 示例 3: 输入:arr = [-1,-1,-1,-1] 输出:-1 解释:最后得到的子数组不能为空,所以我们不能选择 [-1] 并从中删去 -1 来得到 0。 我们应该直接选择 [-1],或者选择 [-1, -1] 再从中删去一个 -1。 提示: 1 <= arr.length <= 10^5 -10^4 <= arr[i] <= 10^4
链接:https://leetcode-cn.com/problems/maximum-subarray-sum-with-one-deletion
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2. 解题
dp[i][0]
表示到以i
位置为结束,没有删除过元素,最大数组和dp[i][1]
表示到以i
位置为结束,删除过1个元素,最大数组和class Solution { public: int maximumSum(vector<int>& arr) { int i, n = arr.size(), maxSum = INT_MIN; vector<vector<int>> dp(n, vector<int>(2,INT_MIN)); dp[0][0] = arr[0];//0位置,不删除元素,最大子序和 dp[0][1] = 0; //0位置,删除元素,最大子序和 maxSum = arr[0]; for(i = 1; i < n; ++i) { // i-1 位置处之前没有删除过,i位置处也不删, 或者 只有 i 自己 dp[i][0] = max(arr[i], dp[i-1][0]+arr[i]); maxSum = max(maxSum, dp[i][0]); // i-1 位置之前删除过,i位置处不删 或者 i-1之前没有删,删除 i 位置 dp[i][1] = max(dp[i-1][1]+arr[i], dp[i-1][0]); maxSum = max(maxSum, dp[i][1]); } return maxSum; } };
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算