void fill_row_q(int imin, int imax, int q, std::vector< std::vector<ldouble> > & S, std::vector< std::vector<size_t> > & J, const std::vector<ldouble> & sum_x, const std::vector<ldouble> & sum_x_sq, const std::vector<ldouble> & sum_w, const std::vector<ldouble> & sum_w_sq, const enum DISSIMILARITY criterion) { // Assumption: each cluster must have at least one point. for(int i=imin; i<=imax; ++i) { S[q][i] = S[q-1][i-1]; J[q][i] = i; int jmin = std::max(q, (int)J[q-1][i]); for(int j=i-1; j>=jmin; --j) { ldouble Sj(S[q-1][j-1] + dissimilarity(criterion, j, i, sum_x, sum_x_sq, sum_w, sum_w_sq) // ssq(j, i, sum_x, sum_x_sq, sum_w) ); if(Sj < S[q][i]) { S[q][i] = Sj; J[q][i] = j; } } } }
int main(void){ take_input(); total_bigram(); printf("%d",dissimilarity()); return 0; }
double operator()(data_point a, data_point b){ return dissimilarity(a, a + dim, b); }
double operator()(data_point& a, data_point& b){ return dissimilarity(a.begin(), a.end(), b.begin()); }