반응형
문제
풀이
점화식이 은근 간단한데 구현에 시간이 오래걸렸습니다.
dp[i][j]는 i+1번째 차례에 +, - 연산으로 숫자 j를 만들 수 있는 경우의 수를 뜻합니다.
dp[0][num[0]] 부터 시작하므로 1을 넣어줍니다.
그 후 루프를 돌면서 dp[i-1][j]값이 0보다 클 경우(가는 방법이 존재할 경우)
더한 값과 뺀 값을 비교하여 조건(0이상 20이하)을 만족한다면 dp에 저장합니다.
루프가 끝난 뒤 num[N-1] 값이 나오는 경우의 수를 dp배열의 값으로 출력해줍니다.
소스 코드
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
30
31
32
33
|
#include<iostream>
#include<vector>
using namespace std;
int N;
int num[100];
long long dp[100][21];
int main()
{
cin >> N;
for (int i = 0; i < N; i++)
{
cin >> num[i];
}
dp[0][num[0]] = 1;
for (int i = 1; i < N - 1; i++)
{
for (int j = 0; j < 21; j++)
{
if (dp[i-1][j] > 0)
{
int add = j + num[i];
int sub = j - num[i];
if (add < 21)
dp[i][add] += dp[i - 1][j];
if (sub >= 0)
dp[i][sub] += dp[i - 1][j];
}
}
}
cout << dp[N - 2][num[N - 1]];
return 0;
}
|
cs |
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[백준 17609] 회문 C++ (0) | 2021.08.21 |
---|---|
[백준 1756] 피자 굽기 (C++) (0) | 2021.08.19 |
[백준 2812] 크게 만들기 (C++) (0) | 2021.08.19 |
[백준 16234] 인구 이동 (C++) (0) | 2021.08.18 |
[백준 2075] N번째 큰 수 (C++) (0) | 2021.08.18 |