2011-06-20 10:32:35 题目地址:http://acm.fzu.edu.cn/problem.php?pid=1005 #include<iostream> #include<string> using namespace std; int main() { int n,k,i,j,r,testCase=0; int distance[201],min[31][201],oneMin[201][201]; while (scanf("%d%d",&n,&k)!=EOF) { if(n==0&&k==0) break; for(i=1;i<=n;i++) scanf("%d",distance+i); memset(min,0,sizeof(min)); memset(oneMin,0,sizeof(oneMin)); // oneMin[i][j],d[i:j]个商店建立一个仓库的最小距离和 for(i=1;i<=n;i++) { oneMin[i][i]=0; for (j=i+1;j<=n;j++) { oneMin[i][j]=oneMin[i][j-1]+distance[j]-distance[(i+j)/2]; } } // min[1:j]:第j个商店前(包括j)建立一个仓库的最小距离和 for(j=1;j<=n;j++) min[1][j]=oneMin[1][j]; // min[r:j]:第j个商店前(包括j)建立r个仓库的最小距离和 for(r=2;r<=k;r++) { min[r][r]=0; for(i=r+1;i<=n;i++) { min[r][i]=2147483647; for(j=r-1;j<i;j++) { int temp=min[r-1][j]+oneMin[j+1][i]; if(temp<min[r][i]) min[r][i]=temp; } } } printf("Chain %d/nTotal distance sum = %d/n/n",++testCase,min[k][n]); } return 0; }