이문제는 정말 경의롭다
1부터 더해나가면 문제를 해결하는데 쉽게 접근 할 수있다.
1은 답이 당연히 1이고.
2는 1에 1을 더한것과 2로나눠지기때문에 2를 나눈 1에 1을 더한것
min(arr[1]+1, arr[2/2]+1)
3은 2에 1을 더한것과 3으로 나눠지기때문에 3을 나눈 1에 1을 더한것
min(arr[2]+1, arr[3/3]+1)
이런식으로 답을 가져가면 N 까지 했을때
arr[N] 에 있는것이 해답이 될것이다.
}
1부터 더해나가면 문제를 해결하는데 쉽게 접근 할 수있다.
1은 답이 당연히 1이고.
2는 1에 1을 더한것과 2로나눠지기때문에 2를 나눈 1에 1을 더한것
min(arr[1]+1, arr[2/2]+1)
3은 2에 1을 더한것과 3으로 나눠지기때문에 3을 나눈 1에 1을 더한것
min(arr[2]+1, arr[3/3]+1)
이런식으로 답을 가져가면 N 까지 했을때
arr[N] 에 있는것이 해답이 될것이다.
#include<iostream>#include<algorithm>#include<vector>using namespace std;vector<int> DP;int main(){ int N; cin >> N; DP.assign(N+1, 0); for (int i = 2; i <= N; i++){ DP[i] = DP[i - 1] + 1; if (i % 2 == 0)DP[i] = min(DP[i], DP[i / 2] + 1); if (i % 3 == 0)DP[i] = min(DP[i], DP[i / 3] + 1); } cout << DP[N] << endl; return 0;