Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
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
Archives
Today
Total
관리 메뉴

dh-winternagi 님의 블로그

(12852) 1로 만들기 2 본문

백준 (C++)/Solve

(12852) 1로 만들기 2

dh-winternagi 2026. 4. 20. 00:00

https://www.acmicpc.net/problem/12852

단계별로 풀어보기

32단계(동적 계획법과 최단거리 역추적) 1번째

 

 

 

이제 단순히 동적 계획법으로 답을 구할 뿐만 아니라 중간 과정까지 구해야 한다.

따라서 경로를 역추적하는 배열을 추가로 만들어 dp값이 갱신될 때마다 직전 경로를 저장한다.

 

 

 

#include <iostream>
#include <vector>
using namespace std;

int main() 
{
  int n;
  
  cin >> n;
  
  vector<int> dp(n+1, 100001), from(n+1);
  
  dp[1]= 0;
  
  for(int i=1;i<n;i++){
    if(dp[i+1]>dp[i]+1){
      dp[i+1]= dp[i]+1;
      from[i+1]= i;
    }

    if(3*i<=n && dp[3*i]>dp[i]+1){
      dp[3*i]= dp[i]+1;
      from[3*i]= i;
    }
    
    if(2*i<=n && dp[2*i]>dp[i]+1){
      dp[2*i]= dp[i]+1;
      from[2*i]= i;
    }
  }
  
  cout << dp[n] << "\n";
  
  while(n){
    cout << n << " ";
    
    n= from[n];
  }
  
  return 0;
}

'백준 (C++) > Solve' 카테고리의 다른 글

(14003) 가장 긴 증가하는 부분 수열 5  (0) 2026.04.20
(14002) 가장 긴 증가하는 부분 수열 4  (0) 2026.04.20
(11062) 카드 게임  (0) 2026.04.19
(7579) 앱  (0) 2026.04.19
(2293) 동전 1  (0) 2026.04.19