- μ¬κ·
- νΈλ¦¬
- DP
- λ€μ΅μ€νΈλΌ
- BFS
- C++
- LCs
- μν°λ
- μΉ΄μΉ΄μ€2021
- μ΄λΆνμ
- μ¬λΌμ΄λ© μλμ°
- js
- μκ³ λ¦¬μ¦
- νλ‘κ·Έλλ¨Έμ€
- ν리μ¨λ³΄λ©
- κ°μ₯κ°κΉμ΄κ³΅ν΅μ‘°μ
- golang
- λΉνΈλ§μ€νΉ
- μΉλ¦°μ΄
- μΉ΄μΉ΄μ€ μ½ν
- λ°±μ€
- Union-Find
- DFS
- go
- λΉνΈλ§΅
- λ°±μλ ν리μ¨λ³΄λ©
- λμ νλ‘κ·Έλλ°
- μμ½λ
- nestjs
- Python
- Today
- Total
Hello Ocean! πΌ
[μκ³ μ€ν] μμν #Quantize, μ± 8.9μ λ³Έλ¬Έ
λ¬Έμ
https://www.algospot.com/judge/problem/read/QUANTIZE
μμ½νμλ©΄ μ£Όμ΄μ§ μμ΄μ sκ°μ μ«μλ‘ μμν ν λ, κ° μ«μλ³ μ€μ°¨μ κ³±μ ν©μ μ΅μν νλ μμν κ²°κ³Όλ₯Ό ꡬν΄μΌ νλ λ¬Έμ μ΄λ€.
νμ΄
μ± μ μλ νμ΄λ₯Ό λ§μ΄ μ°Έκ³ νμλ€.
λ¨Όμ , aμ bλΌλ λκ°μ μ«μκ° μμ λ μ΄ μ«μλ€μ μμν κ²°κ³Όλ₯Ό κ°κ° A,BλΌκ³ νμ.
a<bμΌ λ, A>Bμ΄λ©΄ μλλ€. (μ€μ°¨λ₯Ό μ΅μν νλ κ²μ΄ λͺ©νμ΄κΈ° λλ¬Έμ)
λ°λΌμ μ£Όμ΄μ§ μμ΄μ κ·Έλλ‘ μμννκΈ° 보λ€λ ν¬κΈ°μμΌλ‘ μ λ ¬ν΄μ μΈμ ν μλ€λΌλ¦¬ κ°μ μ«μλ‘ μμν νλ κ²μ΄ λ°λμ§νλ€.
-> μ λ ¬λ μμ΄μ μμλλ‘ sκ°μ λ¬ΆμμΌλ‘ λΆν νλ λ¬Έμ κ° λλ€.
첫 λ¬Άμμ ν¬κΈ°κ° xλΌλ©΄ κ·Έ λ€μ λ¬Έμ λ n-xκ°μ μ«μλ€μ s-1κ°μ λ¬ΆμμΌλ‘ λΆν νλ λ¬Έμ κ° λλ€.
κ·Έλ¦¬κ³ μ΄λ ν λ¬Άμ pλ₯Ό kλ‘ μμν ν λ, κ·Έ κ·Έλ£Ήλ΄μ μ€μ°¨λ₯Ό μ΅μνν μ μλ kλ p λ΄λΆμ μ«μλ€μ νκ· κ°μ΄ λλ€.
(kκ° μ μμ¬μΌ νλ―λ‘ p λ΄λΆμ μ«μλ€μ νκ· κ°μ λ°μ¬λ¦Όν΄μ μ¬μ©νλ€)
μ± μμλ μ΄ μ μ μν곡μμ μ΄μ©ν΄ μ€λͺ νμμΌλ, νλ₯ κ³Ό ν΅κ³λ₯Ό λ°°μ΄ μ¬λμ΄λΌλ©΄ μ΄ λ¬Έμ₯μ μν곡μ μμ΄λ μ΄ν΄ν μ μμ κ²μ΄λΌκ³ μκ°νλ€.
p λ΄λΆμ νκ· μ ꡬνλ μμ μ O(n)μ 볡μ‘λκ° μμλ μ μμ§λ§,
0λ²μ§Έ μ λΆν° iλ²μ§Έ μ κΉμ§μ ν©μ μ μ₯νλ pSum[i]λ₯Ό μ΄μ©ν΄μ O(1)λ‘ κ΅¬ν μ μλ€.
aλ²μ§Έ ~ bλ²μ§Έ μ«μμ νκ· : ( pSum[b] - pSum[a-1] ) / b-a+1
* aκ° 0μΌλλ a-1 μΈλ±μ€λ₯Ό μ κ·Όν μ μμΌλ―λ‘ λ°λ‘ μ²λ¦¬ν΄μ€λ€.
#include <stdio.h>
#include <algorithm>
using namespace std;
//minError()λ₯Ό O(1)μΌλ‘ κ³μ°νκΈ° μν΄ μ¬μ©
int n, s;
int arr[101];
int psum[101];
int pSqSum[101];
const int INF = 987654321; //INT_MAXλ₯Ό μ¬μ©νλ©΄ μλλ€.
int minError(int start,int end) { //startμ end μ¬μ΄μ μ΅μμλ¬λ₯Ό return
int sum,sqSum;
if (start == 0) {
sum = psum[end];
sqSum = pSqSum[end];
}
else {
sum = psum[end] - psum[start - 1];
sqSum = pSqSum[end] - pSqSum[start - 1];
}
//startμ endμ¬μ΄μ μλ€μ νκ· κ°μ λ°μ¬λ¦Όν μλ‘ μμν
int m = int(0.5 + (double)sum / (end - start + 1));
//result = sum(arr[i]-m)^2
int result = sqSum - 2 * m * sum + m * m * (end - start + 1);
//printf("minError(%d, %d) = %d\n", start, end, result);
return result;
}
int cache[101][11]; //μ£Όμ΄μ§ μμ΄μ startμμΉλΆν° λ μ«μ κΉμ§ partsκ°μ λ¬ΆμμΌλ‘ λνλ΄μΌ ν λ κ°λ₯ν κ°μ₯ μμ sqError μ μ₯
int quantize(int start, int parts){
if (start == n) return 0; //λμ λλ¬νμ λ
if (parts == 0) return INF; //λ μ΄μ λ¬Άμ μ μμ λ, μλͺ»λ κ²½μ°μ΄λ―λ‘ μ΅λκ° λ°ν
int & ret = cache[start][parts];
if (ret != -1) return ret;
ret = INF;
printf("ret : %d\n", ret);
//ν΄λΉ λ¬Άμμ κΈΈμ΄λ₯Ό λ³νμν€λ©΄μ μ΅μκ° μ°ΎκΈ°
for (int size = 1;start + size <= n;size++) {
ret = min(ret, minError(start, start + size - 1) + quantize(start + size, parts - 1));
}
return ret;
}
int main() {
int C;
scanf_s("%d", &C);
for (int c = 0;c < C;c++) {
scanf_s("%d %d", &n, &s);
for (int i = 0;i < n;i++)
scanf_s("%d", &arr[i]);
sort(arr, arr+n);
psum[0] = arr[0];
pSqSum[0] = arr[0] * arr[0];
for (int i = 0;i < n;i++) {
psum[i] = psum[i - 1] + arr[i];
pSqSum[i] = pSqSum[i - 1] + arr[i] * arr[i];
}
fill(&cache[0][0], &cache[101][11],-1);
printf("%d\n", quantize(0, s));
}
}
minError(int start, int end)
: start ~ end κΉμ§κ° ν λ¬Άμ μΌ λ (νλμ μ«μλ‘ μμν ν λ) κ°λ₯ν μ΅μμ error return
quantize(int start, int parts)
: start λΆν°μ μ«μλ€μ partsκ°μ λ¬ΆμμΌλ‘ λΆλ¦¬ν λ κ°λ₯ν μ΅μμ error return
'Algorithm' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[μκ³ λ¦¬μ¦ μ€ν°λ] μλ£κ΅¬μ‘°_1 (0) | 2020.07.20 |
---|---|
go μΈμ΄ μμνκΈ° (0) | 2020.07.07 |
[μκ³ λ¦¬μ¦ μ€ν°λ] μκ³ μ€ν #PI (0) | 2020.04.27 |
[μκ³ λ¦¬μ¦ μ€ν°λ] λ°±μ€ #1461 λμκ΄ (1) | 2020.04.23 |
[μκ³ λ¦¬μ¦ μ€ν°λ] λ°±μ€ #9251 LCS (0) | 2020.04.19 |