zoukankan      html  css  js  c++  java
  • P4677 山区建小学|区间dp

    P4677 山区建小学

    题目描述

    政府在某山区修建了一条道路,恰好穿越总共nn个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往。已知任意两个相邻的村庄之间的距离为di
    为了提高山区的文化素质,政府又决定从n个村中选择m个村建小学。
    请根据给定的n、m以及所有相邻村庄的距离,选择在哪些村庄建小学,才使得所有村到最近小学的距离总和最小,计算最小值。
    

    题解:https://www.luogu.org/blog/hsfzLZH1/solution-p4677

    区间dp主要是下面这几段代码
    f[k+1][i],预处理 i~j 村庄之间 建一所学校的最短距离 (建在中心点最优)

        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++)
            {
                if(j>i){dp[i][j]=0;continue;}
                for(int k=j-1;k<=i;k++)  dp[i][j]=min(dp[i][j],dp[k][j-1]+f[k+1][i]);
            }
        }
    

    思路

    主要写一写状态转移方程的思路

    dp[i][j] 表示 前i个村庄 修了j个小学的最小距离和
    状态转移方程怎么表示?
    不难想到 dp[i][j] 是 前k个村庄(k < i) 修了 j - 1个小学推过来的。
    优化k的取值范围,因为前k个村修了j-1个小学,所以k肯定大于小学个数 j - 1

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

  • 相关阅读:
    批量修改文件
    mysql-5.5.32-linux2.6-x86_64.tar.gz 二进制源码定制安装MySQL服务器
    源码搭建nginx服务器
    Python--安装
    k8s-修改线程数
    容器卡在terminate状态无法删除
    扩/
    磁盘分区+挂载
    499
    清理磁盘
  • 原文地址:https://www.cnblogs.com/fisherss/p/10807017.html
Copyright © 2011-2022 走看看