## Summary

In this post, I will introduce some problems related to subarray and dynamic programming.

The most important thing in subarray is that it is continuous. So usually one dimension of the DP will be chosen as “a subarray starting at index i”. Then we need a separate loop for it to choose the best starting point.

## OJ

Trick | Difficulty | |
---|---|---|

LC 53 | Maximum Subarray Sum | 3 points |

LC 644 | Binary Search Result + Greedy + Maximum Subarray Sum | 6 points |

LC 727 | DP+Subarray+Subsequence | 6 points |

## Details

#### Minimum Window Subsequence

Given strings `S`

and `T`

, find the minimum (contiguous) **substring** `W`

of `S`

, so that `T`

is a **subsequence** of `W`

.

```
// alg[i][j], the shortest subarray starting at i in S contains T[j:] as a subsequence.
// alg[i][n] = 0
alg[i][j] = min{
1. 1 + alg[i + 1][j + 1] if S[i] == T[j],
2. 1 + alg[i + 1][j],
}
```

Since dimension `i`

is defined as subarray, we should add 1 even if we don’t want to use the character at `i`

. It is wrong if we go with,

```
alg[i][j] = min{
1. 1 + alg[i + 1][j + 1] if S[i] == T[j],
2. alg[i + 1][j],
}
```