标题:[求助]ACM的题!!一个我没有读懂的题!!
只看楼主
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
得分:0 

去试试看,能不能通过?


2006-11-11 22:33
zhanghuan_10
Rank: 1
等 级:新手上路
威 望:2
帖 子:751
专家分:0
注 册:2006-10-25
得分:0 
呵呵!通过了!

该学习了。。。
2006-11-12 10:06
zhanghuan_10
Rank: 1
等 级:新手上路
威 望:2
帖 子:751
专家分:0
注 册:2006-10-25
得分: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;
}
}

该学习了。。。
2006-11-12 11:45
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
得分:0 

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;

}


2006-11-12 12:03



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-102245-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013000 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved