HDU 1227 Fast Food (DP)

题目链接

题意 :
有n个饭店,要求建k个供应点,要求每个供应点一定要建造在某个饭店的位置上,然后饭店都到最近的供应点拿货,求出所有饭店到最近的供应点的最短距离。

思路 : 一开始没看出来是DP,后来想想就想通了。预处理,如果要在下标为 i 到 j
的饭店建一个供应点,那一定是在下标为(i+j)/2的位置建造的,状态转移方程:dp[i][j] = dp[i-1][k-1]+dis[k][j](i <=
k <= j) ,dp[i][j]代表的是在前 j 个饭店中建了 i
个供应点的最小距离。方程代表的是在前k-1个饭店中已经建了i-1个供应点的最小距离再加上从第k个饭店到第j个饭店建一个供应点增加的距离。如果不明白可以看这里,链接


 1 #include <iostream>
2 #include <stdio.h>
3 #include <string.h>
4 #include <math.h>
5
6 using namespace std;
7 const int maxn = 0x7fffffff ;
8
9 int a[210] ,dis[210][210],dp[210][210];
10
11 int main()
12 {
13 int n,k ,cas = 1;
14 while(~scanf("%d %d",&n,&k))
15 {
16 if(n == 0 && k == 0 ) break ;
17 for(int i = 1 ; i <= n ; i++)
18 scanf("%d",&a[i]) ;
19 for(int i = 1 ; i <= n ; i++)
20 {
21 for(int j = i ; j <= n ; j++)
22 {
23 dis[i][j] = 0 ;
24 for(int k = i ; k <= j ; k++)
25 dis[i][j] += fabs(a[k]-a[(i+j)/2] );

26 }
27 }
28 memset(dp,0,sizeof(dp)) ;
29 for(int i = 1 ; i <= n ; i++)
30 dp[1][i] = dis[1][i] ;
31 for(int i = 2 ; i <= k; i++)
32 {
33 for(int j = 2 ; j <= n ; j++)
34 {
35 int minn = maxn ;
36 for(int k = i ; k <= j ; k++)
37 {
38 if(dp[i-1][k-1]+dis[k][j] < minn)
39 minn = dp[i-1][k-1]+dis[k][j] ;
40 }
41 dp[i][j] = minn ;
42 }
43 }
44 printf("Chain %d\nTotal distance sum = %d\n\n",cas++,dp[k][n]);
45 }
46 return 0;
47 }

HDU 1227 Fast Food (DP)

时间: 2024-12-17 14:05:15

HDU 1227 Fast Food (DP)的相关文章

hdu 1227 Fast Food

http://acm.hdu.edu.cn/showproblem.php?pid=1227 在n个商店中建m个仓库,使各个商店到仓库的路程之和最小,商店到哪个仓库是有选择的,求路程之和最小. dp[i][j]为建i个仓库前j个商店. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define maxn 1000 5 using namespace std; 6 const int

hdu 1277 Fast Food (dp)

题目大意: 一条街上有很多个餐厅,现在要在n个餐厅中选取m个作为仓库. 使得其他的餐厅到这些仓库的距离的和最小. 思路分析: 状态方程: dp [i] [j]  表示  前 j 个餐厅已经建了 i 个仓库. 转移方程: dp[i] [j] = min ( dp[i-1] [k]  + cost[k+1][j] ) ...cost[ p ][ q ] 表示在p q 之间建立一个仓库的最小花费. #include <iostream> #include <cstdio> #includ

[ACM] HDU 1227 Fast Food (经典Dp)

Fast Food Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2173    Accepted Submission(s): 930 Problem Description The fastfood chain McBurger owns several restaurants along a highway. Recently,

hdu 1227 Fast Food(DP)

题意: X轴上有N个餐馆.位置分别是D[1]...D[N]. 有K个食物储存点.每一个食物储存点必须和某个餐厅是同一个位置. 计算SUM(Di-(离第i个餐厅最近的储存点位置))的最小值. 1 <= n <= 200, 1 <= k <= 30, k <= n 思路: 第K个储存点的位置如果确定,前K-1个储存点的位置是浮动的.有很多的重复子结构.DP的结构很明显. dp[i][j]:第i个储存点放在第j个餐馆的位置所得到的最小值. 代码: int n,k; int pos[

hdu 1227(经典dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1227 Fast Food Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2165    Accepted Submission(s): 926 Problem Description The fastfood chain McBurger

HDU 4965 Fast Matrix Calculation 【矩阵】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4965 题目大意:给你一个N*K的矩阵A以及一个K*N的矩阵B (4 <= N <= 1000)以及 (2 <=K <= 6),然后接下来四步: 算一个新的矩阵C=A*B 算M=C^ (N*N) 对于M中的每个元素%6 将M中每个元素加起来,算出和. 也就是求出A*B * A*B * A*B * A*B * A*B *--* A*B   但是A*B形成的矩阵是N*N,而N大小有可能是10

HDU 4960 (水dp)

Another OCD Patient Problem Description Xiaoji is an OCD (obsessive-compulsive disorder) patient. This morning, his children played with plasticene. They broke the plasticene into N pieces, and put them in a line. Each piece has a volume Vi. Since Xi

HDU 1087 &amp;&amp; POJ 2533(DP,最长上升子序列).

~~~~ 两道题的意思差不多,HDU上是求最长上升子序列的和,而POJ上就的是其长度. 貌似还有用二分写的nlogn的算法,不过这俩题n^2就可以过嘛.. ~~~~ 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1087 http://poj.org/problem?id=2533 ~~~~ HDU1087: #include<cstdio> #include<cstring> #include<algorithm> #

hdu 2296 aC自动机+dp(得到价值最大的字符串)

Ring Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3180    Accepted Submission(s): 1033 Problem Description For the hope of a forever love, Steven is planning to send a ring to Jane with a rom