您的位置:首页 > 其它

pku1485 Fast Food

2010-03-08 19:46 211 查看
题目链接:http://acm.pku.edu.cn/JudgeOnline/problemlist?volume=2

题意简述:n个restaurants,k个depots,把k个depots建在n个restaurants的k个中,求怎么建使得n个restaurants到depot取材料所需总路程最短。

解题思路:同pku1160,就是加了个记录路径的简单操作。题目链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=1160

pku1160解题报告:http://blog.csdn.net/ccsu_001/archive/2009/10/15/4677158.aspx

这题的代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define min(a,b) (a<=b ? a:b)
const int Len1=202;
const int Len2=32;
const int inf=1<<30;
int dp[Len1][Len2],dp1[Len1][Len1];
int a[Len1];
inline int abs(int a)
{
if(a>=0) return a;
else return (-a);
}
int main()
{
int n,m;
int Case=0;
while(scanf("%d%d",&n,&m)&&(n||m))
{
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) dp1[i][i]=0;
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
{
int mid=(i+j+1)>>1;
int sum=0;
for(int k=i;k<=j;k++)
if(k!=mid)
sum+=abs(a[k]-a[mid]);
dp1[i][j]=sum;
}
memset(dp,25,sizeof(dp));
for(int i=1;i<=m;i++)
dp[1][i]=0;
int b[32];
for(int i=2;i<=n;i++)
{
dp[i][1]=dp1[1][i];
b[1]=(1+i+1)>>1;
for(int j=2;j<=(m<=i ? m:i);j++)
{
dp[i][j]=inf;
for(int k=1;k<=i-1;k++)
dp[i][j]=min(dp[i][j],dp[k][j-1]+dp1[k+1][i]);
}
}
int tempn;
int nn=n;
int out[32][2];
for(int j=m;j>=2;j--)
{
tempn=nn;
int temp=inf;
for(int k=1;k<=tempn-1;k++)
{
if(dp[k][j-1]+dp1[k+1][tempn]<temp)
{
b[j]=(tempn+k+2)>>1;
out[j][1]=tempn;
out[j][0]=k+1;
temp=dp[k][j-1]+dp1[k+1][tempn];
nn=k;
}
}
}
b[1]=(1+nn+1)>>1;
out[1][1]=nn;
out[1][0]=1;
printf("Chain %d/n",++Case);
for(int i=1;i<=m;i++)
if(out[i][1]!=out[i][0])
printf("Depot %d at restaurant %d serves restaurants %d to %d/n",i,b[i],out[i][0],out[i][1]);
else printf("Depot %d at restaurant %d serves restaurant %d/n",i,b[i],out[i][0]);
printf("Total distance sum = %d/n/n",dp
[m]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: