Block Sequence (Codeforces 1881E)
Tags: DP, dp

Given a sequence of integers $$$a$$$ of length $$$n$$$.A sequence is called beautiful if it has the form of a series of blocks, each starting with its length, i.e., first comes the length of the block, and then its elements. For example, the sequences [$$$\color{red}{3},\ \color{red}{3},\ \color{red}{4},\ \color{red}{5},\ \color{green}{2},\ \color{green}{6},\ \color{green}{1}$$$] and [$$$\color{red}{1},\ \color{red}{8},\ \color{green}{4},\ \color{green}{5},\ \color{green}{2},\ \color{green}{6},\ \color{green}{1}$$$] are beautiful (different blocks are colored differently), while [$$$1$$$], [$$$1,\ 4,\ 3$$$], [$$$3,\ 2,\ 1$$$] are not.In one operation, you can remove any element from the sequence. What is the minimum number of operations required to make the given sequence beautiful?

Input: The first line of the input contains a single integer $$$t$$$ ($$$1 \le t \le 10^4$$$) — the number of test cases. Then follows the descriptions of the test cases.The first line of each test case contains a single integer $$$n$$$ ($$$1 \le n \le 2 \cdot 10^5$$$) — the length of the sequence $$$a$$$.The second line of each test case contains $$$n$$$ integers $$$a_1, a_2, \dots, a_n$$$ ($$$1 \le a_i \le 10^6$$$) — the elements of the sequence $$$a$$$.It is guaranteed that the sum of the values of $$$n$$$ over all test cases does not exceed $$$2 \cdot 10^5$$$.

Output: For each test case, output a single number — the minimum number of deletions required to make the sequence $$$a$$$ beautiful.

Note: In the first test case of the example, the given sequence is already beautiful, as shown in the statement.In the second test case of the example, the sequence can only be made beautiful by removing all elements from it.In the fifth test case of the example, the sequence can be made beautiful by removing the first and last elements. Then the sequence will become [$$$2,\ 3,\ 4$$$].

Sample Inputs:
7
7
3 3 4 5 2 6 1
4
5 6 3 2
6
3 4 1 6 7 7
3
1 4 3
5
1 2 3 4 5
5
1 2 3 1 2
5
4 5 5 1 5

Sample Outputs:
0
4
1
1
2
1
0

Solution (Python):
def dp_solve(n, lst):
    cntlst = [0] * (n + 1)
    cntlst[n - 1] = 1
    for i in range(n - 2, -1, -1):
        cntlst[i] = 1 + cntlst[i + 1]
        if i + lst[i] <= n - 1:
            cntlst[i] = min(cntlst[i], cntlst[i + lst[i] + 1])
    return cntlst[0]
casenum = int(input())
finaloutput = []
for i in range(casenum):
    n = int(input())
    lst = [int(num) for num in input().split()]
    temp = dp_solve(n, lst)
    finaloutput.append(temp)
for num in finaloutput:
    print(num)

Solution (Python):
testCases = int(input())

def solve(n, a):
    dp = [0] * (n + 2)
    dp[n] = 1
    for i in range(n - 1, 0, -1):
        if a[i] > n - i:
            dp[i] = dp[i + 1] + 1
        else:
            dp[i] = min(dp[i + a[i] + 1], dp[i + 1] + 1)
    print(dp[1])
for t in range(testCases):
    n = int(input())
    a = [0] + list(map(int, input().split()))
    solve(n, a)

Solution (Python):
testCases = int(input())

def solve(n, a):
    dp = [0] * (n + 2)
    dp[n] = 1
    for i in range(n - 1, 0, -1):
        if a[i] > n - i:
            dp[i] = dp[i + 1] + 1
        else:
            dp[i] = min(dp[i + a[i] + 1], dp[i + 1] + 1)
    print(dp[1])
for t in range(testCases):
    n = int(input())
    a = [0] + list(map(int, input().split()))
    solve(n, a)