https://www.acmicpc.net/problem/16568
이번 문제는 전에 풀었던 백준 1463(1로 만들기) 문제를 생각해서 풀었습니다.
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 | #include <iostream> #include <algorithm> using namespace std; int main(){ int dp[1000002]={0}; int n,a,b; cin >> n >> a >> b; for(int i = 1; i <= n; i++){ dp[i] = 1000001; } if(b > a){ int tmp = a; a =b; b=tmp; } for(int i = 1; i <= n; i++){ dp[i] = dp[i-1]+1; if(i-a-1 >= 0) dp[i] = min(dp[i],dp[i-a-1]+1); if(i-b-1 >= 0) dp[i] = min(dp[i],dp[i-b-1]+1); } cout << dp[n]; } | cs |
bfs로도 풀어봤습니다.
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 | #include <iostream> #include <algorithm> #include <queue> using namespace std; int bfs(int n, int a, int b){ bool visited[1000001] = {}; queue<int> q; int idx= n; int t = 0; q.push(n); while(1){ int size = q.size(); for(int i = 0; i < size; i++){ idx = q.front(); q.pop(); if(idx==0) return t; if(!visited[idx-1]){ q.push(idx-1); visited[idx-1] = 1; } if(idx-a-1 >= 0 && visited[idx-a-1] == 0){ q.push(idx-a-1); visited[idx-a-1] = 1; } if(idx-b-1 >= 0 && visited[idx-b-1] == 0){ q.push(idx-b-1); visited[idx-b-1] = 1; } } t++; } } int main(){ ios_base::sync_with_stdio(false); int n,a,b; cin >> n >> a >> b; cout << bfs(n,a,b); } | cs |
반응형
'프로그래밍 > 문제풀이' 카테고리의 다른 글
[bfs] 백준 16569 화산쇄설류 (0) | 2019.01.17 |
---|---|
[etc] 백준 13118 뉴턴과 사과 (0) | 2019.01.15 |
[슬라이딩 윈도우] 백준 15831 준표의 조약돌 (0) | 2018.12.31 |
[etc] 백준 15828 Router (0) | 2018.12.28 |
[etc] 백준 14612 김식당 (0) | 2018.12.28 |