Skip to content

Commit e297d0f

Browse files
authored
Create Readme.md
1 parent d8b18c2 commit e297d0f

File tree

1 file changed

+17
-0
lines changed
  • Dynamic_Programming/1186.Maximum-Subarray-Sum-with-One-Deletion

1 file changed

+17
-0
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
### 1186.Maximum-Subarray-Sum-with-One-Deletion
2+
3+
本题可以先从一个很经典的问题出发:如何求一个数组里和最大的subarray?答案是kadane算法,可以用dp的思想来说明。令dp[i]表示以元素i为结尾的subrray里能得到的最大和。因此计算dp[i]时必然会考虑充分利用以元素i-1为结尾的最大subarray。
4+
```
5+
dp[i] = max(dp[i-1]+arr[i], arr[i])
6+
```
7+
注意:也有可能dp[i-1]是个负数反而会带来“负担”,因此上面的状态转移方程里还需要考虑arr[i]本身这个单元素数组的可能性。
8+
9+
那么对于本题而言,我们多了一个"deletion"的权力。如何利用这个权力,处理方法其实和```487.Max Consecutive Ones II```很像。就是将原本的dp[i]再拆分为两个状态。dp[i][0]表示"maximum sum for a non-empty subarray ending at i, w/o any deletion",而dp[i][1]表示"maximum sum for a non-empty subarray ending at i, with one deletion done".
10+
11+
可以分析出新的转移方程:
12+
```
13+
dp[i][0] = max(dp[i-1][0] + arr[i], arr[i]);
14+
dp[i][1] = max(dp[i-1][0], dp[i-1][1] + arr[i]);
15+
```
16+
其中第一条和常规的kadane算法没有差别。第二条是分两种情况讨论,考虑这个被删除的数是否是arr[i]。如果被删的是arr[i],那么问题就转化为求以元素i-1结尾的最大subarray sum;如果被删的不是arr[i],那么说明被删的数是存在于对应dp[i-1][1]的最大subarray里。
17+

0 commit comments

Comments
 (0)