关于石子划分问题的算法时间

jaunt2011 2009-12-16 12:46:30
小生初来乍到,这题,以下代码能够实现石子划分,并能够得到正确答案,但算法超时,恳请高手指点迷津,感激不尽~!


#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);
}
...全文
214 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
绿色夹克衫 2009-12-16
  • 打赏
  • 举报
回复
dp应该可以,先对重量数组W排个序。

f(i,m)表示从第i堆之后,分为m堆,

f(i,m) = min((W[i+1] - W[i])^2 + f(i+2,m-1),(W[i+2] - W[i])^2 + f(i+3,m-1)......(W[n-m] - W[i])^2 + f(n-m,m-1)

另外如果1堆只有1块怎么算呢?如果算0的话,稍微修改一下就可以了!
LeonTown 2009-12-16
  • 打赏
  • 举报
回复
mark
cn9268 2009-12-16
  • 打赏
  • 举报
回复
up..
jaunt2011 2009-12-16
  • 打赏
  • 举报
回复
题目是:给定n个石子,其重量为a1,a2...,an,要求将其划分为m堆,每一份划分的费用定义为这堆石头中最大重量与最小重量的差的平方。总划分费用等于各堆费用之和。 输入:n m 及a1,a2...,an ,输出:sum
,要求算法时间不超过500MS
醉杯殇 2009-12-16
  • 打赏
  • 举报
回复
题目呢……

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧