POJ 1160

POJ 1160

題意

有n個村莊,要求選其中的p個建立郵局,求最小的距離。

思路

學習kedebug博客思路代碼

#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;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容