Algorithm/알고스팟

algospot - quantize

jhg0406 2020. 2. 3. 13:29
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
//algospot - quantize
 
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
#define INF 200000000
 
int N, S;
vector<int> v;
vector<int> subv;
vector<int> subv2;
vector<vector<int>> cache;
 
void init()
{
    cin >> N >> S;
    subv2 = subv = v = vector<int>(N);
    cache = vector<vector<int>>(N, vector<int>(S+1-1));
    for(int i = 0; i<N; ++i)
        cin >> v[i];
    sort(v.begin(), v.end());
 
    subv[0= v[0];
    for(int i = 1; i<N; ++i)
        subv[i] = subv[i-1+ v[i];
 
    subv2[0= v[0]*v[0];
    for(int i = 1; i<N; ++i)
        subv2[i] = subv2[i-1+ v[i]*v[i];
}
 
int getMid(int start, int end)
{
    double u = subv[end- subv[start] + v[start];
    u /= (end-start+1);
    int v = u;
    if(u - (double)v > 0.5)
        return v + 1;
    else
        return v;
}
 
 
int mini(int start, int end)
{
    int a = getMid(start, end);
    int n = end-start + 1;
    int part = subv2[end- subv2[start] + v[start]*v[start];
    int part2 = 2*a*(subv[end]-subv[start]+v[start]);
    int part3 = n*a*a;
    return part-part2+part3;
}
 
int dive(int from, int part)
{
    if(from == N)
        return 0;
    if(!part)
        return INF;
    int& ret = cache[from][part];
    if(ret != -1)
        return ret;
    ret = INF;
    for(int size = 0size < N-from; ++size)
        ret = min(ret, mini(from, from+size+ dive(from+size+1, part-1));
    return ret;
}
 
int main()
{
    int C; cin >> C;
    for(int tn = 0; tn<C; ++tn)
    {
        init();
        cout << dive(0, S) << "\n";
    }
}
cs

 

 

 

 

 

https://www.algospot.com/judge/problem/read/QUANTIZE

 

algospot.com :: QUANTIZE

Quantization 문제 정보 문제 Quantization (양자화) 과정은, 더 넓은 범위를 갖는 값들을 작은 범위를 갖는 값들로 근사해 표현함으로써 자료를 손실 압축하는 과정을 말한다. 예를 들어 16비트 JPG 파일을 4컬러 GIF 파일로 변환하는 것은 RGB 색 공간의 색들을 4컬러 중의 하나로 양자화하는 것이고, 키가 161, 164, 170, 178 인 학생 넷을 '160대 둘, 170대 둘' 이라고 축약해 표현하는 것 또한 양자화라고 할

www.algospot.com

 

 

 

 

 

QUANTIZE

DP문제

cache[from][part] : 오름차순으로 정렬된 수열에서 from부터 시작하고, 사용할수 있는 숫자가 part개 남았을때 양자화한 결과의 최소를 저장하고 있는 배열

 

 

 

 

 

시간복잡도

총 N*S개의 부분문제와 각 부분문제당 N의 시간이 걸립니다.

O(S*N^2)