3699. Number of ZigZag Arrays I
Description
You are given three integers n, l, and r.
A ZigZag array of length n is defined as follows:
- Each element lies in the range
[l, r]. - No two adjacent elements are equal.
- No three consecutive elements form a strictly increasing or strictly decreasing sequence.
Return the total number of valid ZigZag arrays.
Since the answer may be large, return it modulo 109 + 7.
A sequence is said to be strictly increasing if each element is strictly greater than its previous one (if exists).
A sequence is said to be strictly decreasing if each element is strictly smaller than its previous one (if exists).
Example 1:
Input: n = 3, l = 4, r = 5
Output: 2
Explanation:
There are only 2 valid ZigZag arrays of length n = 3 using values in the range [4, 5]:
[4, 5, 4][5, 4, 5]
Example 2:
Input: n = 3, l = 1, r = 3
Output: 10
Explanation:
There are 10 valid ZigZag arrays of length n = 3 using values in the range [1, 3]:
[1, 2, 1],[1, 3, 1],[1, 3, 2][2, 1, 2],[2, 1, 3],[2, 3, 1],[2, 3, 2][3, 1, 2],[3, 1, 3],[3, 2, 3]
All arrays meet the ZigZag conditions.
Constraints:
3 <= n <= 20001 <= l < r <= 2000
Solutions
Solution 1: Dynamic Programming
Thinking
A zigzag array alternates the sign of consecutive differences. Values lie in \([l,r]\) and \(n\le 2000\), so we shift the range to \([0,m-1]\) and DP.
\(\textit{up}[i]\) and \(\textit{down}[i]\) count arrays ending at \(i\) whose last step rises or falls. A descent sums all larger \(\textit{up}\); an ascent sums all smaller \(\textit{down}\).
Prefix and suffix sums make each of the \(n-1\) rounds \(O(m)\). Length \(1\) seeds both directions with \(1\). Reduce the total modulo \(10^9+7\).
Let \(m = r - l + 1\) and map the range \([l, r]\) to \([0, m - 1]\).
Let \(up[i]\) be the number of arrays of the current length that end with \(i\) whose last step is an increase, and \(down[i]\) the number whose last step is a decrease. For length \(1\) there is no direction, so initialize \(up[i] = down[i] = 1\).
Transitions:
- If the array ends at \(i\) with a decrease, the previous value must be greater than \(i\) and the previous step must be an increase: \(down'[i] = \sum_{j > i} up[j]\);
- If the last step is an increase: \(up'[i] = \sum_{j < i} down[j]\).
Prefix and suffix sums make each transition \(O(m)\). Repeat \(n - 1\) times. The answer is the sum of all \(up[i] + down[i]\).
The time complexity is \(O(n \times m)\), and the space complexity is \(O(m)\), where \(n\) is the array length and \(m\) is the size of the value range.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | |