For each index, we can split nums[i] into arr1[i] and arr2[i] such that arr1 is non-decreasing and arr2 is non-increasing, and arr1[i] + arr2[i] = nums[i]. The number of ways to do this can be computed using DP, where we keep track of the last value of arr1 and the last value of arr2.
classSolution {
public:int countMonotonicPairs(vector<int>& nums) {
constint MOD =1e9+7;
int n = nums.size(), mx =*max_element(nums.begin(), nums.end());
vector<vector<int>> dp(n, vector<int>(mx+1, 0));
for (int a =0; a <= nums[0]; ++a) dp[0][a] =1;
for (int i =1; i < n; ++i) {
vector<int> pre(mx+2, 0);
for (int a =0; a <= nums[i-1]; ++a) pre[a+1] = (pre[a] + dp[i-1][a]) % MOD;
for (int a =0; a <= nums[i]; ++a) {
int b = nums[i] - a;
if (b <0|| b > mx) continue;
if (i ==1|| b <= nums[i-1] - a) {
dp[i][a] = pre[a+1];
}
}
}
int ans =0;
for (int a =0; a <= nums[n-1]; ++a) ans = (ans + dp[n-1][a]) % MOD;
return ans;
}
};
classSolution {
publicintcountMonotonicPairs(int[] nums) {
int MOD = 1_000_000_007, n = nums.length, mx = 0;
for (int v : nums) mx = Math.max(mx, v);
int[][] dp =newint[n][mx+1];
for (int a = 0; a <= nums[0]; ++a) dp[0][a]= 1;
for (int i = 1; i < n; ++i) {
int[] pre =newint[mx+2];
for (int a = 0; a <= nums[i-1]; ++a) pre[a+1]= (pre[a]+ dp[i-1][a]) % MOD;
for (int a = 0; a <= nums[i]; ++a) {
int b = nums[i]- a;
if (b < 0 || b > mx) continue;
dp[i][a]= pre[a+1];
}
}
int ans = 0;
for (int a = 0; a <= nums[n-1]; ++a) ans = (ans + dp[n-1][a]) % MOD;
return ans;
}
}
classSolution {
funcountMonotonicPairs(nums: IntArray): Int {
val MOD = 1_000_000_007
val n = nums.size
val mx = nums.maxOrNull() ?:0val dp = Array(n) { IntArray(mx+1) }
for (a in0..nums[0]) dp[0][a] = 1for (i in1 until n) {
val pre = IntArray(mx+2)
for (a in0..nums[i-1]) pre[a+1] = (pre[a] + dp[i-1][a]) % MOD
for (a in0..nums[i]) {
val b = nums[i] - a
if (b < 0|| b > mx) continue dp[i][a] = pre[a+1]
}
}
var ans = 0for (a in0..nums[n-1]) ans = (ans + dp[n-1][a]) % MOD
return ans
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
classSolution:
defcountMonotonicPairs(self, nums: list[int]) -> int:
MOD =10**9+7 n = len(nums)
mx = max(nums)
dp = [[0] * (mx+1) for _ in range(n)]
for a in range(nums[0]+1):
dp[0][a] =1for i in range(1, n):
pre = [0] * (mx+2)
for a in range(nums[i-1]+1):
pre[a+1] = (pre[a] + dp[i-1][a]) % MOD
for a in range(nums[i]+1):
b = nums[i] - a
if b <0or b > mx:
continue dp[i][a] = pre[a+1]
return sum(dp[n-1][a] for a in range(nums[n-1]+1)) % MOD
impl Solution {
pubfncount_monotonic_pairs(nums: Vec<i32>) -> i32 {
constMOD: i32=1_000_000_007;
let n = nums.len();
let mx =*nums.iter().max().unwrap();
let mx = mx asusize;
letmut dp =vec![vec![0; mx+1]; n];
for a in0..=nums[0] asusize {
dp[0][a] =1;
}
for i in1..n {
letmut pre =vec![0; mx+2];
for a in0..=nums[i-1] asusize {
pre[a+1] = (pre[a] + dp[i-1][a]) %MOD;
}
for a in0..=nums[i] asusize {
let b = nums[i] asisize- a asisize;
if b <0|| b > mx asisize { continue; }
dp[i][a] = pre[a+1];
}
}
letmut ans =0;
for a in0..=nums[n-1] asusize {
ans = (ans + dp[n-1][a]) %MOD;
}
ans
}
}