poj1160-Post Office

[这是一道DP题]

dp[i][j]表示i个村庄共享j个邮局的最优距离总和
sum[i][j]表示第i个村庄到第j个村庄共享一个邮局的距离总和

dp[i][j] = min(dp[i][j], dp[k][j-1] + sum[k][i]);

p[i]表示村庄i的坐标

sum[i][j] =  sum[i][j-1] + p[j] - p[(i+j)/2];

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define min(a, b) (a) < (b) ? (a) : (b)
int dp[310][31];
int sum[310][310];
int v, p;
int pos[310];
int main(){
    while(scanf("%d%d", &v, &p) != EOF){
        for(int i = 1; i <= v; i++){
            cin>>pos[i];
        }
        memset(sum, 0, sizeof(sum));
        for(int i = 1; i < v; i++){
            for(int j = i + 1; j <= v; j++){
                sum[i][j] = sum [i][j-1] + pos[j] - pos[(i+j)/2];
            }
        }
        for(int i = 1; i <= v; i++){
            dp[i][i] = 0;
            dp[i][1] = sum[1][i];
        }
        for(int j = 2; j <= p; j++){
            for(int i = j+1; i <= v; i++){
                dp[i][j]=100000;
                for(int k = j - 1; k < i; k++){
                    dp[i][j] = min(dp[i][j], dp[k][j-1] + sum[k+1][i]);
                }

            }
        }
        printf("%d\n", dp[v][p]);
    }
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,768评论 0 33
  • 动态规划(Dynamic Programming) 本文包括: 动态规划定义 状态转移方程 动态规划算法步骤 最长...
    廖少少阅读 3,322评论 0 18
  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 13,719评论 0 89
  • 1.地理各段知识性质不同,应适当变化思维和学习模式,才能更好适应。 2.复习重点要背,其他的至少要看一遍理解下。不...
    鬼马姑娘阅读 457评论 1 1
  • 苏格拉底说过一句话,人生最大的知识是知道自己的无知。孔子也说过知之为知之,不知为不知,是为无知也。为什么中外圣贤都...
    blackhorse0802阅读 589评论 0 0