μ€λλ§μ tag: DPλ‘ κ²μν΄μ νμ΄λ³Έ λ¬Έμ . DP λ¬Έμ λ μ€λ²κΉμ§λ κ΅μ₯ν μ¬λ―Έμλ€. 골λλΆν°λ κ΄μ°°μ΄ μ’ μ΄λ €μμ Έμ νμ΄κ° νλ€μ§λ§.. (23λ 8μ κΈ°μ€) PSμ λΉμΆ μμμ΄κΈ° λλ¬Έμ κΎΈμ€ν μ°μ΅ν΄μΌ νλ€.
μ΄ λ¬Έμ κ°μ κ²½μ° μμ λ²μμ μ£Όλͺ©ν΄λ³΄λ©΄ μΈλ°, λ‘λ TLE
κ° λλ€. κ·Έλμ μ‘°κΈ λ¨Έλ¦¬λ₯Ό κ΅΄λ €λ³΄λ©΄, 루ν μμͺ½μμ λ λλ μμ λ²μκ° μ κ³±μμ΄λ―λ‘ μ νμ΄λ²μ λ μ¬λ¦΄ μ μμλ€.
λ€λ§ λͺ¨λ N
μ λν΄μ μ΅μκ° λλ μ κ³± μμ ν©μΌλ‘ λͺλ²λ§μ μ
λ°μ΄νΈ λλμ§μ λν νμ μ΄ μμ΄μ set
μ μμ΄μ νμ΄νλ€. λμ€μ μκ°ν΄λ³΄λ νμκ° μλ κ³Όμ μ΄μμ§λ§..
#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef unsigned long long ull;int main() {int N; scanf("%d", &N);vector<int> v; v.resize(N + 1);fill(v.begin(), v.end(), 100000);vector<int> squares;vector<int> tmp; tmp.resize(N + 1);set<int> S;for(int i = 1; i <= N; ++i) S.insert(i);for(int i = 1; i * i <= N; ++i) {v[i*i] = 1;squares.push_back(i*i);S.erase(i*i);}while(S.size() > 0) {for(int i = 1; i <= N; ++i) {for(auto& s: squares) {if (i + s <= N) {if (v[i + s] > v[i] + 1) {v[i + s] = v[i] + 1;S.erase(i + s);}} else {break;}}}}printf("%d\n", v[N]);return 0;}
μ μ½λκ° κΉλνμ§ λͺ»ν΄μ set
μ μ¬μ©ν λΆλΆμ μ΄λ»κ² μ κ±°ν μ§ κ³ λ―Όν΄λ³΄λ μ μ ν μ΄κΈ°κ° μΈν
μΌλ‘ set
μ μμ¨ μ μμλ€. μ΄κΈ°κ°μ μμ μ΄μ©ν΄μ μΈν
νλ€. μλ μ½λκ° μ΅μ’
μ μΆ μ½λ.
#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef unsigned long long ull;int main() {int N; scanf("%d", &N);int dp[100001];for(int i = 0; i <= N; ++i) dp[i] = i;for(int i = 0; i <= N; ++i) {for(int j = 2; j * j <= N; ++j) {int s = j * j;if (i + s <= N) {if (dp[i + s] > dp[i] + 1) {dp[i + s] = dp[i] + 1;}} else {break;}}}printf("%d\n", dp[N]);return 0;}