2020 Jan Platinum Problem 2 Non-Decreasing Subsequences
Official Problem StatementEdit
Problem Statement:
Given a sequence of N (1 ≤ N ≤ 10,000) integers, determine the number of non-decreasing subsequences of length K (1 ≤ K ≤ N).
Solution:
The solution to this problem is to use dynamic programming. We can create an array dp[N][K] where dp[i][j] represents the number of non-decreasing subsequences of length j ending at index i. We can then fill the array using the following recurrence relation:
dp[i][j] = dp[i-1][j] + dp[i-1][j-1] if arr[i] >= arr[i-1]
dp[i][j] = dp[i-1][j] otherwise
The base cases are dp[0][0] = 1 and dp[i][0] = 1 for all i.
The answer to the problem is the sum of all dp[N][K] values.
C++ Code:
- include <bits/stdc++.h>
using namespace std;
int main() {
int N, K; cin >> N >> K; vector<int> arr(N); for (int i = 0; i < N; i++) cin >> arr[i]; vector<vector<int>> dp(N, vector<int>(K + 1, 0)); for (int i = 0; i < N; i++) { dp[i][0] = 1; for (int j = 1; j <= K; j++) { dp[i][j] = dp[i-1][j]; if (i > 0 && arr[i] >= arr[i-1]) { dp[i][j] += dp[i-1][j-1]; } } } int ans = 0; for (int i = 0; i < N; i++) { ans += dp[i][K]; } cout << ans << endl; return 0;
}