2021. 9. 1. 01:01ㆍ알고리즘/다이나믹프로그래밍
문제
https://www.acmicpc.net/problem/5557문제 정의
상근이가 1학년 때, 덧셈, 뺄셈을 매우 좋아했다. 상근이는 숫자가 줄 지어있는 것을 보기만 하면, 마지막 두 숫자 사이에 '='을 넣고, 나머지 숫자 사이에는 '+' 또는 '-'를 넣어 등식을 만들며 놀고 있다. 예를 들어, "8 3 2 4 8 7 2 4 0 8 8"에서 등식 "8+3-2-4+8-7-2-4-0+8=8"을 만들 수 있다.
상근이는 올바른 등식을 만들려고 한다. 상근이는 아직 학교에서 음수를 배우지 않았고, 20을 넘는 수는 모른다. 따라서, 왼쪽부터 계산할 때, 중간에 나오는 수가 모두 0 이상 20 이하이어야 한다. 예를 들어, "8+3+2-4-8-7+2+4+0+8=8"은 올바른 등식이지만, 8+3+2-4-8-7이 음수이기 때문에, 상근이가 만들 수 없는 등식이다.
숫자가 주어졌을 때, 상근이가 만들 수 있는 올바른 등식의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 숫자의 개수 N이 주어진다. (3 ≤ N ≤ 100) 둘째 줄에는 0 이상 9 이하의 정수 N개가 공백으로 구분해 주어진다.
출력
첫째 줄에 상근이가 만들 수 있는 올바른 등식의 개수를 출력한다. 이 값은 263-1 이하이다.
예제 입력 1
11 8 3 2 4 8 7 2 4 0 8 8
예제 출력 1
10
접근 방법
- 1. dp 테이블을 0부터 20까지 초기화하고 처음 주어진 수의 인덱스에 1을 저장한다.
- 2. 주어진 수를 하나씩 탐색하며 더하고 뺀 값의 인덱스에 +1씩 더해준다.
- 2-1. 이때 0과 20 사이의 범위를 벗어나면 값을 저장하지 않는다.
- 3. 주어진 수를 모두 탐색하고 dp 테이블 내의 모든 값을 합한 뒤, 출력한다.
코드
# 접근방법
# 1. dp 테이블을 0부터 20까지 초기화하고 처음 주어진 수의 인덱스에 1을 저장한다.
# 2. 주어진 수를 하나씩 탐색하며 더하고 뺀 값의 인덱스에 +1씩 더해준다.
# 2-1. 이때 0과 20 사이의 범위를 벗어나면 값을 저장하지 않는다.
# 3. 주어진 수를 모두 탐색하고 dp 테이블 내의 모든 값을 합한 뒤, 출력한다.
import sys
n = int(input())
array = list(map(int, sys.stdin.readline().split()))
dp = [0] * 21
dp[array[0]] = 1
# for x in array[1:n-1]:
# temp = []
# for i in range(len(dp)):
# if dp[i] != 0:
# if i+x <= 20:
# for _ in range(dp[i]):
# temp.append(i+x)
# if i-x >= 0:
# for _ in range(dp[i]):
# temp.append(i-x)
# dp = [0] * 21
# for t in temp:
# dp[t] += 1
# print(dp[array[n-1]])
for x in array[1:n-1]:
temp_p = [dp[i-x] if i-x >= 0 else 0 for i in range(len(dp))]
temp_m = [dp[i+x] if i+x <= 20 else 0 for i in range(len(dp))]
for i in range(len(dp)):
dp[i] = temp_p[i] + temp_m[i]
print(dp[array[n-1]])
'알고리즘 > 다이나믹프로그래밍' 카테고리의 다른 글
백준 온라인 저지, 다이나믹프로그래밍 / 11053번: 가장긴증가하는부분수열 (파이썬 / 백준 골드문제) (0) | 2021.09.03 |
---|---|
백준 온라인 저지, 다이나믹프로그래밍 / 1520번: 내리막길 (파이썬 / 백준 골드문제) (0) | 2021.09.01 |
백준 온라인 저지, 다이나믹프로그래밍 / 2096번: 내려가기 (파이썬 / 백준 골드문제) (0) | 2021.08.29 |
백준 온라인 저지, 다이나믹프로그래밍 / 11054번: 가장긴바이토닉부분수열 (파이썬 / 백준 골드문제) (0) | 2021.08.29 |
백준 온라인 저지, 다이나믹프로그래밍 / 1463번: 1로만들기 (파이썬) (0) | 2021.08.29 |