일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 2
- 11066
- 컴공
- 스택
- 1
- 오늘의 계획
- 오픽
- BFS
- knuth_optimization
- 브루트포스
- 파이썬
- 정규 표현식 #문자열
- 코딩
- DP
- ENFJ
- 다이나믹 프로그래밍
- 백트래킹
- 백준
- HTML
- DFS
- 백준풀이
- Greedy
- 정렬
- 3
- 더하기 시리즈
- Python
- 웹 페이지 입문
- 수 정렬하기2
- 구현
- 12969
- Today
- Total
코딩하는 Fug
5557 1학년 본문
https://www.acmicpc.net/problem/5557
5557번: 1학년
상근이가 1학년 때, 덧셈, 뺄셈을 매우 좋아했다. 상근이는 숫자가 줄 지어있는 것을 보기만 하면, 마지막 두 숫자 사이에 '='을 넣고, 나머지 숫자 사이에는 '+' 또는 '-'를 넣어 등식을 만들며 놀
www.acmicpc.net
#5557 1학년 정리
'''
bfs 인데 dp를 사용할 거임. 식은 고정이고 마지막 수 전까지를 식으로 써서 마지막 수가 나와야 되는것.
고로 마지막 수를 먼저 저장을 시킨다음에 dp를 마지막 수 전까지 돌리고 마지막수가 맞는지 확인 후 cnt+1 이런식으로 돌려야 될듯
돌릴때 조건은 i>=0 and i<=20
'''
import sys
input=sys.stdin.readline
#스탠다드 인풋
n=int(input())
#n입력
numbers=list(map(int,input().split()))
#numbers 리스트 생성
dp={numbers[0]:1}
#초기값 설정 처음 식은 등호 없이 1
answer=numbers[n-1]
#답은 마지막 값
for i in range(1,n-1):
nextdp={}
for number,cnt in dp.items():
if number+numbers[i]<=20:
nextdp[number+numbers[i]]=nextdp.get(number+numbers[i],0)+cnt
if number-numbers[i]>=0:
nextdp[number-numbers[i]]=nextdp.get(number-numbers[i],0)+cnt
dp=nextdp
#dp를 돌리는데 조건에 맞으면 +cnt 를 해준다 단 탐색되지 않았던 것에 경우에는 cnt로 설정해준다.
print(dp[answer])
#답
#기본적인 dp 문제, dict를 이용하여 잘 해냈다 와후
'백준풀이-python' 카테고리의 다른 글
2616 소형기관차 (0) | 2021.12.01 |
---|---|
2281 데스노트 (0) | 2021.11.17 |
12865 평범한 배낭 (0) | 2021.10.25 |
12026 BOJ 거리 (0) | 2021.10.21 |
11058 크리보드 (0) | 2021.10.21 |