关于石子划分问题的算法时间
小生初来乍到,这题,以下代码能够实现石子划分,并能够得到正确答案,但算法超时,恳请高手指点迷津,感激不尽~!
#include<stdio.h>
void PX(int *a,int shangbiao,int xiabiao)
{
int j,t,k,m;
j=shangbiao;
k=xiabiao;
m=j;
if(shangbiao<xiabiao)
{
while(j<k)
{
for(;k>m;k--)
{
if(a[k]<a[m])
{
t=a[k];
a[k]=a[m];
a[m]=t;
m=k;
break;
}
}
j++;
for(;j<m;j++)
{
if(a[j]>a[m])
{
t=a[j];
a[j]=a[m];
a[m]=t;
m=j;
break;
}
}
k--;
}
PX(a,shangbiao,m-1);
PX(a,m+1,xiabiao);
}
}
int PF(int n)
{
return n*n;
}
int Minvalues(int n,int m,int *b)
{
int i,residual,values,min_values;
//PX(n,b);
/*for(i=0;i<n;i++)
{
printf("%d ",b[i]);
}*/
if(m==1)
{
if(n==1)
min_values=0;
else
min_values=PF(b[n-1]-b[0]);
}
else
{
min_values=Minvalues(n-1,m-1,b);
for(i=2;i<=n-m+1;i++)
{
residual=b[n-1]-b[n-i];
values=Minvalues(n-i,m-1,b)+PF(residual);
if(min_values>values)
min_values=values;
}
}
return min_values;
}
void main(){
int n,m,i,theMinvalues;
int tonevalue[1000];
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
{
scanf("%d",&tonevalue[i]);
}
PX(tonevalue,n-1,0);
//for(i=0;i<n;i++)
//{
// printf("%d ",tonevalue[i]);
// }
theMinvalues=Minvalues(n,m,tonevalue);
printf("%d",theMinvalues);
}