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>
#include <cstring>
#include <algorithm>

using namespace std;

int dp[40][300];
int cost[300][300];
int pos[300];
int Abs(int x)
{
    return x>0?x:-x;
}
int main()
{
    int n,m,cas=1;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(n==0 && m==0)break;

        for(int i=1;i<=n;i++)
            scanf("%d",&pos[i]);

        memset(cost,0,sizeof cost);
        for(int i=1;i<=n;i++)
        {
            for(int j=i;j<=n;j++)
            {
                for(int k=i;k<=j;k++)
                {
                    cost[i][j]+=Abs(pos[k]-pos[(i+j)>>1]);
                }
            }
        }

        memset(dp,0x3f,sizeof dp);

        for(int i=1;i<=m;i++)dp[i][i]=0;
        for(int i=1;i<=n;i++)dp[1][i]=cost[1][i];//初始化
        for(int i=2;i<=m;i++)//已经初始化了 i == 1 的情况
        {
            for(int j=1;j<=n;j++)
            {
                for(int k=i-1;k<=j;k++)//从 i-1 开始
                {
                    dp[i][j]=min(dp[i][j],dp[i-1][k]+cost[k+1][j]);
                }
            }
        }

        printf("Chain %d\nTotal distance sum = %d\n\n",cas++,dp[m][n]);
    }
    return 0;
}

hdu 1277 Fast Food (dp)

时间: 2024-10-10 18:26:02

hdu 1277 Fast Food (dp)的相关文章

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 个供应点的最小距离.方

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 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

hdu 2457 AC自动机+dp

DNA repair Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2004    Accepted Submission(s): 1085 Problem Description Biologists finally invent techniques of repairing DNA that contains segments c

hdu 4965 Fast Matrix Calculation(矩阵快速幂)

题目链接:hdu 4965 Fast Matrix Calculation 题目大意:给定两个矩阵A,B,分别为N*K和K*N: 矩阵C = A*B 矩阵M=CN?N 将矩阵M中的所有元素取模6,得到新矩阵M' 计算矩阵M'中所有元素的和 解题思路:因为矩阵C为N*N的矩阵,N最大为1000,就算用快速幂也超时,但是因为C = A*B, 所以CN?N=ABAB-AB=AC′N?N?1B,C' = B*A, 为K*K的矩阵,K最大为6,完全可以接受. #include <cstdio> #inc

HDU 4965 Fast Matrix Calculation(矩阵快速幂)

HDU 4965 Fast Matrix Calculation 题目链接 矩阵相乘为AxBxAxB...乘nn次,可以变成Ax(BxAxBxA...)xB,中间乘n n - 1次,这样中间的矩阵一个只有6x6,就可以用矩阵快速幂搞了 代码: #include <cstdio> #include <cstring> const int N = 1005; const int M = 10; int n, m; int A[N][M], B[M][N], C[M][M], CC[N]