문제 풀이/Baekjoon Online Judge
[Baekjoon - 22971] 증가하는 부분 수열의 개수
hibye1217
2023. 2. 13. 20:42
난이도: Silver II
태그
더보기
- Dynamic Programming
- Longest Increasing Subsequence
풀이
1. DP 세우기
더보기
\( dp_{i} \) = \( i \)번째 원소를 끝으로 하는 LIS의 개수 를 정의해봅시다.
초항은 \( dp_{0} = 1 \)입니다.
점화식은 어떨까요?
\( A_{j} < A_{i} \)인 모든 \( j \)에 대해, \( [\ldots, A_j, A_i] \)의 수열을 만들 수 있으므로
\( dp_{i} = \sum\limits_{j<i \text{ and } A_j < A_i} dp_{j} \)가 됩니다.
2. 코드
더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
const ll mod = 998244353;
int arr[5020];
ll dp[5020];
void Main(){
int n; cin >> n;
for (int i = 1; i <= n; i++){ cin >> arr[i]; }
dp[0] = 1; for (int i = 1; i <= n; i++){
for (int j = 0; j < n; j++){
dp[i] += (arr[j] < arr[i])*dp[j];
dp[i] %= mod;
}
cout << dp[i] << ' ';
}
}
|
cs |