-
[5557] 1학년BOJ 2021. 8. 30. 16:58
https://www.acmicpc.net/problem/5557
5557번: 1학년
상근이가 1학년 때, 덧셈, 뺄셈을 매우 좋아했다. 상근이는 숫자가 줄 지어있는 것을 보기만 하면, 마지막 두 숫자 사이에 '='을 넣고, 나머지 숫자 사이에는 '+' 또는 '-'를 넣어 등식을 만들며 놀
www.acmicpc.net
<문제>
6
5 2 1 4 1 7 같은 입력이 들어오면,
5 - 2 - 1+ 4 + 1 = 7 처럼 n-1개의 수를 더하거나 빼 n번째 숫자를 만들 수 있는 경우의 수를 세야한다.
이와 더불어, 왼쪽부터 차례대로 계산할때 값이 항상 0이상 20이하인 경우의 수만 세야한다.
다이나믹으로 해결할 수 있는 문제이고
dp[i][j]에서 i를 숫자의 개수, [j]를 숫자의 값으로 놓으면
우리가 구해야하는 답은 n-1개의 숫자를 사용해 a[n]을 만드는, dp[n-1][a[n]]이 된다.
<소스코드>
1234567891011121314151617181920#include<stdio.h>int a[101], n;long long dp[101][21];int main(void) {int i, j;scanf("%d", &n);for (i = 1; i <= n; i++)scanf("%d", &a[i]);dp[1][a[1]] = 1;for (i = 2; i <= n; i++) {for (j = 0; j <= 20; j++) {if (j - a[i] >= 0)dp[i][j] += dp[i - 1][j - a[i]];if (j + a[i] <= 20)dp[i][j] += dp[i - 1][j + a[i]];}}printf("%lld", dp[n-1][a[n]]);return 0;}cs 'BOJ' 카테고리의 다른 글
[10451] 순열 사이클 (0) 2021.08.30 [1303] 전쟁 - 전투 (0) 2021.08.30 [2212] 센서 (0) 2021.08.30 [2470] 두 용액 (0) 2021.08.27 [1932] 정수 삼각형 (0) 2021.08.24