POJ 1160
題意
有n個村莊,要求選其中的p個建立郵局,求最小的距離。
思路
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 310;
const int IFNS = 0x3fffffff;
int dp[MAXN][MAXN],cost[MAXN][MAXN],x[MAXN];
int vil,office;
int calccost(int i, int j){
int ans = 0;
while(i<j){
ans += x[j] - x[i];
i++,j--;
}
return ans;
}
int workout(){
for(int i=0;i<office;i++){
for(int j = i;j<= vil;j++){
dp[0][0] = 0;
}
}
for(int i=1;i<=office;i++){
for(int j=i;j<=vil;j++){
for(int k=0;k<j;k++)
dp[i][j] = min(dp[i][j],dp[i-1][k]+cost[k+1][j]);
}
}
return dp[office][vil];
}
int main(){
// 輸入村莊數,郵局 還有村莊的位置
while(~scanf("%d%d",&vil,&office)){
x[0] = 0;
for(int i=0;i<vil;i++){
scanf("%d",&x[i]);
}
for(int i=1;i<=vil;i++)
for (int j = i; j <= vil; ++j)
cost[i][j] = calccost(i,j);//計算兩個村莊之間所有村莊的距離之和
printf("%d\n",workout());
}
return 0;
}