레야몬
[C++] 12852번 1로 만들기 2 - DP 본문
#include <iostream>
#include <algorithm>
#define LOOP(i, N) for(int i=2; i<=N; i++)
#define MAX_N 1000001
#define INF 987654321
using namespace std;
int N; //정수 N
int dp[MAX_N]; //DP
int bf[MAX_N]; //before
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> N;
LOOP(i, N) { //아래에서 부터 차근차근 올라가기
dp[i]=dp[i-1]+1;
bf[i]=i-1;
if(!(i%2) && dp[i]>dp[i/2]+1) {
dp[i] = dp[i/2]+1;
bf[i]=i/2;
}
if(!(i%3) && dp[i]>dp[i/3]+1) {
dp[i] = dp[i/3]+1;
bf[i]=i/3;
}
}
int i=N;
cout << dp[N] << '\n';
while(i) {
cout << i << ' ';
i=bf[i];
}
return 0;
}
전형적인 DP문제
작은 것 부터 천천히 키워나가면 된다.
※현재 고등학교 등교중인 학생입니다. 이제 알고리즘을 본격적으로 공부하기 시작해서 아직 초보입니다. 혹시 제가 잘못 알고있는 점이나 더 좋은 풀이 방법이 있어 댓글에 남겨주시면 감사히 하나하나 열심히 읽어보겠습니다. 좋아요, 단순한 댓글 한마디라도 저에겐 큰 힘이 됩니다! 감사합니다.
'알고리즘 > 백준' 카테고리의 다른 글
[C++] 14003번 가장 긴 증가하는 부분 수열 5 - 이분 탐색, 가장 긴 증가하는 부분 수열 (0) | 2022.09.30 |
---|---|
[C++] 13460번 구슬 탈출 2 - 구현, 시뮬레이션 (0) | 2022.09.29 |
[C++] 2048 (Easy) - 브루트포스, 구현, 시뮬레이션 (0) | 2022.09.29 |
[C++] 12015번 가장 긴 증가하는 부분 수열 2 - 이분 탐색, 가장 긴 증가하는 부분 수열 (0) | 2022.09.28 |
[C++] 11049번 행렬 곱셈 순서 - DP (0) | 2022.09.28 |
Comments