当前位置: 代码迷 >> C语言 >> [求助]ACM的题!!一个我没有读懂的题!!
  详细解决方案

[求助]ACM的题!!一个我没有读懂的题!!

热度:163   发布时间:2006-11-11 22:33:18.0

去试试看,能不能通过?


----------------解决方案--------------------------------------------------------
呵呵!通过了!
----------------解决方案--------------------------------------------------------
麻烦版主说一下这个函数是做什么 用的?p[i][j]这个不用定义吗?(*p)[N]这个是什么意思啊?呵呵!我今天刚看到 指针这里。
void dis(int (*p)[N],int *pos,int n)
{
int i,j,k,s;
for(i=1;i<=n;i++)
for(j=i;j<=n;j++)
{
s=0;
for(k=i;k<=j;k++)
s+=abs(pos[k]-pos[(i+j)/2]);
p[i][j]=s;
}
}

----------------解决方案--------------------------------------------------------

int (*p)[N]表示 指向有N个整型元素的数组
所以p[i][j]就不用定义

这个效率稍微提高一些:


#include<stdio.h>
#define N 201
#define M 31
void dis(int (*p)[N],int *pos,int n)
{
int i,j,k,s;
int pp[N][N];
for(i=1;i<=n;i++)
for(j=i;j<=n;j++)
pp[j][i]=pp[i][j]=pos[j]-pos[i];
for(i=1;i<=n;i++)
for(j=i;j<=n;j++)
{
s=0;
for(k=i;k<=j;k++)
s+=pp[k][(i+j)/2];
p[i][j]=s;
}
}
int mindis(int (*p)[N],int (*dp)[M],int n,int k)
{
int i,j,t,min,temp;
for(i=1;i<=n;i++)
for(j=1;j<=k;j++)
{
min=1<<30;
if (j==1)
dp[i][j]=p[1][i];
else
{
for(t=j-1;t<i;t++)
{
temp=dp[t][j-1]+p[t+1][i];
if(temp<min)
min=temp;
}
dp[i][j]=min;
}
}
return dp[n][k];
}


int main()
{
int v[N][N],pos[M],dp[N][M];
int n,k,i,count=0;
while(EOF!=scanf("%d%d",&n,&k))
{
if(n==0 && k==0)
break;
for(i=1;i<=n;i++)
scanf("%d",&pos[i]);
dis(v,pos,n);
count++;
printf("Chain %d\n",count);
printf("Total distance sum = %d\n\n",mindis(v,dp,n,k));
}
return 0;

}


----------------解决方案--------------------------------------------------------
  相关解决方案