일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- dynamic programming
- 공부
- BOJ
- 강의
- 2021
- 다이나믹프로그래밍
- 알고리즘
- mmdetection
- it
- python 강의
- 파이썬
- 머신러닝
- 자작시
- 라즈베리파이 모니터
- mmcv
- IOT
- 강좌
- 라즈베리파이
- 파이썬 강의
- 2020
- 백준
- dp
- 프로그래밍
- python 강좌
- 철학
- 계획
- python
- 라즈베리파이3
- 파이썬 강좌
- C++
- Today
- Total
목록
전체 글
(105)
반응형
Stargazer
접근: DP(Dynamic Programming)을 이용해서 푸는 문제. 발상은 행렬 곱셈이 이루어진 후에 두 행렬이 하나의 행렬로 이루어지기 때문에 작은 문제를 뭉쳐서 큰 문제를 해결 할 수 있음을 암시한다. 전략: 전체 행렬의 곱을 큰 문제로 보았을 때, 두 행렬의 곱으로 나눌 수 있고(구간 단위로), 이는 작은 문제로 나누어서 해결한다는 뜻이다. 그 행렬을 구할 수 있는 모든 경우의 수 중에 가장 연산이 가장 작으려면, 구간을 어떻게 나누었을 때 가장 곱 연산이 작은 지를 알면된다. 따라서 구간을 잘게 쪼개어 DP적으로 해결한다. 맨 아래(기본 행렬 곱)에 도달 했을 때, 두 행렬의 곱 연산 수를 구하여서 그 값을 저장한다. 이를 쌓아서 올리면 전체 곱셈 순서를 구할 수 있게 된다. -> 행렬을 나..
접근: 접근은 처음에는 DP로 하려다가 너무 길 것 같아서 포기하였고, 아이디어가 떠오르지 않아서 검색을 해보았다. 그랬더니, 이분 탐색을 이용한 풀이가 있었다. 전략: 가장 긴 수열을 만들기 위해서는 그 숫자들의 간격이 가장 작게 숫자를 설정하는 것인데, 하나 씩 조사를 할 때, 해당하는 값을 포함하는 새로운 수열을 만드는 것처럼 배열 내의 값을 inplace 하여 계속 해서 업데이트 해나가는 방식이다. (작동 방식은 그러한데 직접 해보기 전에는 이해하기 어려웠다.) 매 값을 입력 받을 때, 수열 맨 뒤의 값이 더 작으면 뒤로 삽입 해주고 작다면, 배열 내에 그 값보다 크면서 제일 작은 것을 찾아서 이 값으로 바꾼다. 코드: #include #include using namespace std; int ..
접근: 대충 봐도 탐색 문제이고, 맵 전체를 탐색 해야 하기 때문에 BFS로 탐색하기로 결정함 전략: 우선 시작점은 (0,0)으로 하고, 건물 외벽부터 시작이므로 맵의 변을 2씩 증가시켜서, 패딩을 주어 갈수 있는 경로를 만들면 뚫려있는 곳이나 열쇠를 가지고 있는 문은 통과가 가능하다. 그 다음 주어진 키에 맞게 먼저 전체 탐색을 BFS로 진행하고, 그 중에 발견된 키(중복 포함)가 있으면, 다시 한번 전체 탐색을 한다. 더 이상 새로운 키가 발견되지 않을 때까지 반복해서 전체 탐색을 진행 한다. 그 과정에서 발견된 문서는 합계하여 출력한다. 코드: #include #include using namespace std; int test; char map[102][102]; bool visit[102][10..
접근: 최소 길이를 찾는 문제이기 때문에 BFS로 접근한다. 전략: D,S,L,R 의 연산 과정과 현재 숫자를 큐에 넣고, 한번 씩 돌린다. 이때 이전 상태를 반복하지 않기 위해서 visit 한 상태를 저장하는 배열을 만들어 사용한다. 코드: #include #include using namespace std; //DSLR int t; bool visit[10001]; void bfs(int a , int b){ queue q; q.push({a,""}); for(auto& a : visit){ a = false; } while(!q.empty()){ auto cur = q.front(); q.pop(); if(cur.first == b){ cout t; for(int test=0;test> a >> b..
솔직히 DP는 매번 접근법을 잘 모르겠다... 대충 느낌은 DP 일거라 생각이 들지만 어떻게 해야할 지는 상세히는 모르겠다. (열심히 공부하자..ㅠㅠ) 접근: 이전 결과를 이용하여 현재 결과를 결정하는 방식으로 풀 수 있기 때문에 DP로 풀면된다. 전략: 이전 정보를 저장하는 dp[101][10000] 배열을 만들고, 매 앱을 하나씩 확인하면서, 이전 상태를 참고하여 앱의 cost를 선택하거나 선택하지 않았을때의 최대 확보 할 수 있는 메모리를 비교한다. 끝에는 모든 앱을 비교한 상태들 중 cost가 가장 작은 것을 선택한다. 코드: #include #include using namespace std; int n,m; struct App{ int mem; int cost; }; vector app; in..