您的位置:首页 > 其它

HDU 1227 Fast Food (DP)

2014-05-04 00:22 441 查看
题目链接

题意 : 有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个饭店建一个供应点增加的距离。如果不明白可以看这里,链接

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>

using namespace std;
const int maxn = 0x7fffffff ;

int a[210] ,dis[210][210],dp[210][210];

int main()
{
int n,k ,cas = 1;
while(~scanf("%d %d",&n,&k))
{
if(n == 0 && k == 0 ) break ;
for(int i = 1 ; i <= n ; i++)
scanf("%d",&a[i]) ;
for(int i = 1 ; i <= n ; i++)
{
for(int j = i ; j <= n ; j++)
{
dis[i][j] = 0 ;
for(int k = i ; k <= j ; k++)
dis[i][j] += fabs(a[k]-a[(i+j)/2] );
}
}
memset(dp,0,sizeof(dp)) ;
for(int i = 1 ; i <= n ; i++)
dp[1][i] = dis[1][i] ;
for(int i = 2 ; i <= k; i++)
{
for(int j = 2 ; j <= n ; j++)
{
int minn = maxn ;
for(int k = i ; k <= j ; k++)
{
if(dp[i-1][k-1]+dis[k][j] < minn)
minn = dp[i-1][k-1]+dis[k][j] ;
}
dp[i][j] = minn ;
}
}
printf("Chain %d\nTotal distance sum = %d\n\n",cas++,dp[k]
);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: