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;
}