去试试看,能不能通过?
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;
}