Koder / 박성훈
article thumbnail

N이 그리 크지 않아서

O(N^2) 풀이를 적용할 수 있다.

https://www.acmicpc.net/problem/22971

 

22971번: 증가하는 부분 수열의 개수

길이가 $N$인 수열 $A$가 주어진다. 수열의 $i$번째 원소($A_i$)로 끝나는 증가하는 부분 수열의 개수를 출력하는 프로그램을 작성하자. 단, 수가 너무 커질 수 있으니 $998\,244\,353$으로 나눈 나머지를

www.acmicpc.net

심지어 문제에서 친절하게 점화식 짜는거까지 도와준다

dp[i]를 Ai로 끝나는 증가하는 부분 수열의 개수로 정의하면

dp[i]를 1로 초기화 해두고,

(0<=j<i) 인 j 에대해서 Aj < Ai일때 부분수열을 그대로 이어받아 확장할수 있게 되니

+=연산자로 적당히 더해주면 된다.

 

#include <bits/stdc++.h>
#define MOD 998244353
using namespace std;
typedef long long int ll;

int A[12345] = {0};
ll dp[12345] = {0}; 

int main(){
	cin.sync_with_stdio(false);
	cin.tie(NULL);
	
	for(int i=0; i<12345; i++) dp[i] = 1;
	
	int N;
	cin >> N;
	for(int i=0; i<N; i++){
		cin >> A[i];
	}
	
	for(int i=1; i<N; i++){
		for(int j=0; j<i; j++){
			if(A[j] < A[i]){
				dp[i] += dp[j];
				dp[i] %= MOD;
			}
		}
	}
	
	for(int i=0; i<N; i++){
		cout << dp[i] << " ";
	}
	return 0;
}

/*
N^2가 되네욤 ㄴㅇㅅ
dp[i] : Ai로 끝나는 증가하는부분수열의 개수
dp[i] = 1로 초기화 
dp[i] = for(int j=0; j<i; j++)에 대해서
if(Aj < Ai){
	dp[i] += dp[j]
} 
*/

깔끔하게 AC

반응형