hdu1227 n个站点建m个餐厅使(每个站点到他最近的餐厅)和最小

前i个站点建j个餐厅=

min(前k个站点建j-1个餐厅+最后一个餐厅必然建在a[(k+1+i)/2]的位置) (j-1<=k<i)

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #include<math.h>
 5 using namespace std;
 6 int dp[205][35],cost[205][205],a[205];
 7 int main()
 8 {
 9     int i,j,m,n,k,temp,mid,minx,t=0;
10     while (~scanf("%d%d",&n,&m)&&n&&m)
11     {
12         for (i=1;i<=n;i++)
13             scanf("%d",&a[i]);
14         for (i=1;i<=n;i++)
15             for (j=i;j<=n;j++)
16         {
17             mid=a[(i+j)/2];  temp=0;
18             for (k=i;k<=j;k++)
19                 temp+=abs(a[k]-mid);
20             cost[i][j]=temp;
21         }
22         memset(dp,0,sizeof(dp));
23         for (i=1;i<=n;i++)
24             dp[i][1]=cost[1][i];
25         for (i=1;i<=n;i++)
26             for (j=2;j<=i&&j<=m;j++)
27         {
28             minx=0x3f3f3f3f;
29             for (k=j-1;k<i;k++)
30                 minx=min(minx,dp[k][j-1]+cost[k+1][i]);
31             dp[i][j]=minx;
32         }
33         printf("Chain %d\n",++t);
34         printf("Total distance sum = %d\n\n",dp[n][m]);
35     }
36 }
View Code

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1227

转载于:https://www.cnblogs.com/xiao-xin/articles/4067118.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值