#include <stdio.h>
float arr2[5000][5000];//saves the min cost values of all the elements
float arr3[5000][5000];
float arr1[5000];//contains the func values
int arr4[5000]; //used for final bucket elements
float arr5[5000];//contais the elements that were first taken into consideration for buckets
float arr6[5000]; //calculating final mean
int arr7[5000];//to keep all the values of elements for all cases
float arr8[5000];//to keep final mean bucketss
int i,x,l;
int t,n,k;
float min=10000000000000;
float u();
float v();
int main()
{
int l;
int abcde;
int element_counter=0;
int mean_counter=0;
while(t>0 && t<=100) //run for every test case
{
float elements_sub[5000];
float elements_sq[5000];
float sum=0;
float mean=0;
float sq_sum=0;
float cost=0;
if(n>0 && n<=2500 && k>0 && k<=n)//checking for values of n and k
{
for(i=0;i<n;i++)
{
scanf("%f",&arr1
[i
]); //takes the functional values }
int k_main=k;//finally putting values
int n_main=n;
{
for(i=0;i<n;i++) //calculation only for the first row
{
//printf("value of i : %d\n",i);
sum=0;
for(l=0;l<=i;l++)//to add the elements cost from arr1
{
sum= sum + arr1[l];
//printf("checking sum after %d element is added : %f \n",l,sum);
}
//printf("value of sum : %f\n",sum);
mean= sum/(i+1); //calc the mean
//printf("value of mean : %f\n",mean);
sq_sum=0;
for(l=0;l<=i;l++)
{
elements_sub[l]= arr1[l]-mean;
//printf("checking element sub after %d element is subtracted : %f \n",l,elements_sub[l]);
elements_sq[l]= elements_sub[l] * elements_sub[l];
//printf("checking element sq after %d element is squared : %f \n",l,elements_sq[l]);
sq_sum= sq_sum + elements_sq[l];
//printf("checking current sum after %d element is added : %f \n",l,sq_sum);
}
//printf("value of square sum : %f\n",sq_sum);
cost= sq_sum;//mean sq calculated
//printf("value of cost : %f\n",cost);
arr2[0][i]=cost;
//printf("%f\n",arr2[0][i]);
}
}
//need to calculate for subsequent rows - values of k
int y; //varies for k values- different buckets
for(y=1;y<k;y++)
{
for(i=0;i<n;i++)
{
for(x=0;x<=i;x++)
{
//printf("value of x : %d\n",x);
cost = u(y-1,x) + v(x+1,i); //only called the functions here
//printf("value of cost_mainf : %f\n",cost);
if(cost<min)
{
min=cost;
arr3[y][i]=x+2;
}
if(cost==0)
{
min=0;
arr3[y][i]=x+2;
break;
}
}
arr2[y][i]=min;
min=10000000000000;
}
}
//printing the min cost array
//printf("min cost values array\n");
/*for(i=0;i<k;i++)
{
for(l=0;l<n;l++)
{
printf("%f ",arr2[i][l]);
if(l== n-1)
{
printf("\n");
}
}
}*/
//printf("values of x+2 stored\n");
/*for(i=1;i<k;i++)
{
for(l=0;l<n;l++)
{
//printf("%f ",arr3[i][l]);
if(l== n-1)
{
//printf("\n");
}
}
}*/
//creating another array with final k bucket element Values
arr5[0]=arr3[k_main-1][n_main-1];
//printf("value of [k-2][n-1] is %f\n",arr5[0]);
int p;
int r;
p=arr5[0];
//printf("value of p is %d \n",p);
int q=1;
r=k-2;
//printf("value of r is %d\n",r);
while((k-2)>0)
{
//printf("Inside the loop %d\n",k-2);
arr5[q]=arr3[k_main-1-q][p-1];
//printf("value of p-1 is %d\n",p-1);
//printf("value of arr5[%d] is %f\n",q,arr5[q]);
p=arr5[q];
//printf("value of p is %d\n",p);
q++;
//printf("value of q is %d\n",q);
k--;
//printf("value of k is %d\n",k);
}
//printing bucket Values
int z;
//printf("final k bucket values\n");
arr5[k_main-1]=1;
int counter=0;
int bucket=arr5[k_main-1];
for(z=k_main-1;z>=0;z--)
{
if(z==k_main-1)
{
arr4[0]=(int)arr5[z];
//printf("%d\n",arr4[0]);
counter++;
}
else
{
if(bucket!=arr5[z])
{
bucket=arr5[z];
arr4[counter]=(int)arr5[z];
//printf("%d\n",arr4[counter]);
counter++;
}
}
}
//calculating final means
//printf("calculating final element means-step fucn\n");
int elem1,elem2;
for(i=0;i<counter;i++)
{
// printf("value of i is %d\n",i);
sum=0;
elem1=arr4[i]-1;
//printf("value of elem1 is %d\n",elem1);
if((i+1)==counter)
{
elem2=n_main;
}
else
elem2=arr4[i+1]-1;
//printf("value of elem2 is %d\n",elem2);
for(l=elem1;l<elem2;l++)
{
sum= sum + arr1[l];
}
arr6[i]=sum/(elem2-elem1);
//printf("value of arr6[%d] is %f\n",i,arr6[i]);
}
//printf("printing bucket elements\n");
//printf("%d %f\n",counter,arr2[k_main-1][n_main-1]);
arr7[element_counter]=counter;
arr8[element_counter]=arr2[k_main-1][n_main-1];
element_counter++;
for(x=0;x<counter;x++)
{
//printf("%d %f\n",arr4[x],arr6[x]);
arr7[element_counter]=arr4[x];
arr8[element_counter]=arr6[x];
element_counter++;
}
for(i=0;i<n;i++)
{
arr4[i]=0;
arr5[i]=0;
arr6[i]=0;
}
for(i=0;i<k;i++)
{
for(l=0;l<n;l++)
{
arr2[i][l]=0;
arr3[i][l]=0;
}
}
counter=0;
sum=0;
}
/*else
printf("Values don't fall under the boundaries");*/
t--;
}//end of while loop
for(x=0;x<element_counter;x++)
{
printf("%d %f\n",arr7
[x
],arr8
[x
]); }
}
float u(a,b)
{
//printf("array value is : %f \n", arr2[a][b]);
return arr2[a][b];
}
float v(p,q)
{
float sum=0;
float sq_sum=0;
int count=0;
float mean=0;
float elements_sub[5000];
float elements_sq[5000];
float cost=0;
int z;
//printf("value of p : %d\n",p);
//printf("value of q : %d\n",q);
if(p>=q)
return 0;
else
{
for(z=p;z<=q;z++)
{
sum=arr1[z] + sum;
count++;
}
//printf("value of sum_v : %f\n",sum);
mean= sum/count;
//printf("value of mean_v : %f\n",mean);
for(z=p;z<=q;z++)
{
elements_sub[z]=arr1[z]-mean;
elements_sq[z]= elements_sub[z] * elements_sub[z];
sq_sum= sq_sum + elements_sq[z];
}
cost= sq_sum;
//printf("value of cost_v : %f\n",cost);
}
return cost;
}