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 |
Tags
- Crossfit
- Flutter
- 동적프로그래밍
- 4811
- D1
- 15353
- dart
- sw expert academy
- 스택
- 1로만들기2
- 해시해킹
- 재귀함수
- 그리디
- Python
- 26008
- 14863
- C++
- 백준
- 서울에서경산까지
- 회전하는큐
- 재귀
- 브루트포스
- DP
- 1781
- 15662
- spring boot
- 삼성
- BOJ
- BOJ14889
- 크로스핏
Archives
- Today
- Total
곧죽어도 콛잉
[DP (동적 프로그래밍) / BOJ 12852 / C++] 1로 만들기 2 본문
https://www.acmicpc.net/problem/12852
12852번: 1로 만들기 2
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 자연수 N이 주어진다.
www.acmicpc.net
이번 문제는 그냥 dp하나만 보면 간단하게 풀릴 수 있었는데 ..
최소값을 구하는 것 뿐만 아니라 최솟값이 나오기까지의 과정도 보여줘야한다.
즉, dp 진행 중, 중간의 값들을 계속해서 "Tracing" 해야한다.
다행스럽게도, 잘 생각해보면 특정값 X는 최소의 연산횟수를 보장하는 경로가 단 한가지 연산 밖에 없다.
(여러 경로가 있지만, 그럼에도 최선의 선택은 1개뿐.)
예를 들어, 10의 경우는 9, 9의 경우는 3, 3의 경우는 1이 전부다.
10 9 3 1
즉 이것을 새로운 DP의 값으로 보여줄 수 있다.
이를 활용해 dp값이 갱신될때마다 dp2를 갱신시켜 값을 계속 트레이싱한다.
#include <bits/stdc++.h>
using namespace std;
int dp[1000001], dp2[1000001], N;
int go(int cal){
if(cal<1) return INT_MAX;
if(cal==1) return 0;
int &mid = dp[cal];
if(mid!=INT_MAX) return mid;
if(cal%3==0){
int m1 = go(cal/3)+1;
if(mid > m1){
dp2[cal]=cal/3;
mid = m1;
}
}
if(cal%2==0){
int m2 = go(cal/2)+1;
if(mid > m2){
dp2[cal]=cal/2;
mid = m2;
}
}
int m3 = go(cal-1)+1;
if(mid > m3){
dp2[cal]=cal-1;
mid = m3;
}
return mid;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
fill(&dp[0], &dp[0]+1000001, INT_MAX);
cin >> N;
int answer = go(N);
cout << answer << '\n';
cout << N << ' ';
for(int i = N; i > 1; i=dp2[i]){
cout << dp2[i] << ' ';
}
cout << '\n';
}
'Coding Test > C++' 카테고리의 다른 글
[그리디 / BOJ 1541 / C++] 잃어버린 괄호 (0) | 2023.08.16 |
---|---|
[DP (동적 프로그래밍) / BOJ 4811 / C++] 알약 (0) | 2023.08.12 |
[DP (동적 프로그래밍) / BOJ 2342 / C++] Dance Dance Revolution (0) | 2023.08.06 |
[DP (동적 프로그래밍) / BOJ 14863 / C++] 서울에서 경산까지 (0) | 2023.08.06 |
[LIS (가장 긴 증가하는 부분 수열) / BOJ 11053 / C++] 가장 긴 증가하는 부분 수열 (0) | 2023.08.02 |
Comments