Notice
Recent Posts
Recent Comments
Link
거의 알고리즘 일기장
백준 12852번 _ 1로 만들기 2 본문
https://www.acmicpc.net/problem/12852
풀이방법
1. 연산을 사용하는 횟수의 최솟값을 찾고
2. 1에서 이용한 dp값을 역추적해서 경로를 찾는다.
코드
#include <iostream>
#include <algorithm>
#define MAXN 1000000
#define INF 987654321
using namespace std;
int dp[MAXN + 1];
int N;
void dpInit()
{
for (int i = 1; i <= N; i++)
dp[i] = -1;
}
int GetMinValue(int n)
{
int& ret = dp[n];
if (ret != -1)
return ret;
if (n == 1)
return ret = 0;
ret = INF;
if (n % 3 == 0)
ret = min(ret, GetMinValue(n / 3)+1);
if (n % 2 == 0)
ret = min(ret, GetMinValue(n / 2)+1);
ret = min(ret, GetMinValue(n - 1)+1);
return ret;
}
void print(int n)
{
if (n == 0)
return;
cout << n <<' ';
if (n % 3 == 0 && (dp[n] == dp[n / 3] + 1))
print(n / 3);
else if (n % 2 == 0 && (dp[n] == dp[n / 2] + 1))
print(n / 2);
else if (n -1 >= 0 && (dp[n] == dp[n - 1] + 1))
print(n - 1);
}
int main()
{
cin >> N;
dpInit();
cout << GetMinValue(N) << endl;
print(N);
return 0;
}
반응형
'알고리즘 문제풀이' 카테고리의 다른 글
N과 M (0) | 2020.06.24 |
---|---|
백준 9251, 9252, 1958 _ LCS 1, 2, 3 (0) | 2020.06.17 |
백준 12738번, 14003번 _ 가장 긴 증가하는 부분 수열 3, 5 (0) | 2020.06.13 |
알고스팟 _ 합친 LIS (0) | 2020.05.16 |
codeforces Round #636 (Div. 3) (A, B, C) review (0) | 2020.05.12 |
Comments