반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- dfs
- 13908
- msSQL
- OFFSET
- 퇴사통보
- 경력
- 오퍼레터
- 처우협의
- boj #19237 #어른 상어
- BFS
- 성적평가
- 이분탐색
- 6987
- 처우산정
- compose
- 백준
- Docker
- incr
- @P0
- softeer
- 백트래킹
- BOJ
- 연결요소
- 기술면접
- 물채우기
- 소프티어
- Kafka
- 파라메트릭
- upper_bound
- 매개변수탐색
Archives
- Today
- Total
기술 블로그
1301번 비즈 공예 본문
728x90
반응형
https://www.acmicpc.net/problem/1301
dp 다이나믹 cache 캐시 복습 코테 코딩 필수 추천 boj 백준 동적 계획
아래 3개의 문제도 같이 풀어보길 꼭 추천한다.
https://www.acmicpc.net/problem/14238
https://www.acmicpc.net/problem/14243
https://www.acmicpc.net/problem/12969
cache[a][b][c][d][e][f][g] :
a는 1번 공의 현재 개수
b는 2번 공의 현재 개수
.
.
e는 5번 공의 현재 개수
f는 그 전의 공 번호
g는 그 전전의 공 번호
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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | #include<bits/stdc++.h> using namespace std; int n, a[7]; long long cache[11][11][11][11][11][7][7]; // 1번, 2번, 3번, 4번, 5번 구슬의 현재 개수와 전의 구슬 번호(before), 전전의 구슬 번호(bbefore) long long dfs(int one, int two, int three, int four, int five, int before, int bbefore) { // 모든 구슬을 모두 사용했다면 if (one == 0 && two == 0 && three == 0 && four == 0 && five == 0) { return 1; } // 음수가 있다면 0을 return if (one < 0 || two < 0 || three < 0 || four < 0 || five < 0) { return 0; } long long &ret = cache[one][two][three][four][five][before][bbefore]; if (ret != -1) { return ret; } ret = 0; // 1번 구슬의 개수가 1 이상이고 전과 전전의 공이 1번이 아니라면 if (one >= 1 && before != 1 && bbefore != 1) { // 전(before)이 전전(bbefore)로 갈 것이고, // 현재(one) 공이 전(before)으로 갈 것이다. // bbefore은 신경 쓸 필요 없다. ret = dfs(one - 1, two, three, four, five, 1, before); } // 2번 구슬의 개수가 1 이상이고 전과 전전의 공이 2번이 아니라면 if (two >= 1 && before != 2 && bbefore != 2) { ret += dfs(one, two - 1, three, four, five, 2, before); } // 3번 구슬의 개수가 1 이상이고 전과 전전의 공이 3번이 아니라면 if (three >= 1 && before != 3 && bbefore != 3) { ret += dfs(one, two, three - 1, four, five, 3, before); } // 4번 구슬의 개수가 1 이상이고 전과 전전의 공이 4번이 아니라면 if (four >= 1 && before != 4 && bbefore != 4) { ret += dfs(one, two, three, four - 1, five, 4, before); } // 5번 구슬의 개수가 1 이상이고 전과 전전의 공이 5번이 아니라면 if (five >= 1 && before != 5 && bbefore != 5) { ret += dfs(one, two, three, four, five - 1, 5, before); } return ret; } int main() { cin.tie(0); memset(cache, -1, sizeof(cache)); scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); } printf("%lld\n", dfs(a[1], a[2], a[3], a[4], a[5], -1, -1)); return 0; } | cs |
728x90
반응형
'알고리즘 문제 > BOJ' 카테고리의 다른 글
3079번 입국심사 (0) | 2020.03.17 |
---|---|
3020번 개똥벌레 (0) | 2020.03.17 |
4348번 막대 정사각형 (0) | 2020.03.15 |
1648번 격자판 채우기 (0) | 2020.03.14 |
2916번 자와 각도기 (0) | 2020.03.14 |