151 words
1 minutes
[BOJ] 육각수
| TimeLimit | MemoryLimit | Condition | TAG | 
|---|---|---|---|
| 2s | 128MB | (1 ≤ N ≤ 1’000’000 | Dynamic Programming | 
그냥 전형적인 dp 문제인데, 단순한 연산이여서 1초를 10억으로 보고서 처리하면 간단히 풀 수 있는 문제
정답 코드
#include <iostream>
#include <queue>
#include <set>
#include <algorithm>
#include <random>
#define mod 1000000007LL
#define MAX 1'000'000LL
using namespace std;
using ll = long long;
ll n;
ll dp[MAX+1];
vector<ll> nums;
int main(){
    cin >> n;
    
    
    dp[0] = 0;
    dp[1] = 1;
    nums.push_back(1);
    for(int i = 2; i <= n; i++){
        if(i == (nums.size() + 1) * 2 + nums.size()*2 - 1 + nums.back()) {
            nums.push_back(i);
            dp[i] = 1;
        }
        else{
            dp[i] = i;
            for(ll num : nums) dp[i] = min(dp[i], dp[i - num] + 1);
        }
    }
    
    cout << dp[n];
    return 0;
}
