zoukankan      html  css  js  c++  java
  • openjudge7624 山区建小学

    描述

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

    输入第1行为m和n,其间用空格间隔
    第2行为(m-1) 个整数,依次表示从一端到另一端的相邻村庄的距离,整数之间以空格间隔。

    例如
    10 3
    2 4 6 5 2 4 3 1 3
    表示在10个村庄建3所学校。第1个村庄与第2个村庄距离为2,第2个村庄与第3个村庄距离为4,第3个村庄与第4个村庄距离为6,...,第9个村庄到第10个村庄的距离为3。输出各村庄到最近学校的距离之和的最小值。样例输入

    10 2
    3 1 3 1 1 1 1 1 3

    样例输出

    18

    来源元培-From Whf

    首先预处理出所有区间内建一个小学所取得的距离的最小值,考虑到小学辐射范围是一个连续的区间(数学归纳即可证得),所以可以枚举每个小学,然后往右更新分割点

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define inf 100000000
    int dp[505][505][505],dis[505][505],d[505],sum[505],miv[505];
    using namespace std;
    int main(){
        
        int n,m,tmpl = 0,tmpr = 0,tmp;
        cin>>m>>n;
        for(int i = 1;i < m;i++){
            cin>>d[i];
            sum[i+1] = sum[i] + d[i];
        }
        for(int i = 1;i <= m;i++){
            tmpl = tmpr = 0;
            for(int l = i;l >= 1;--l,tmpl += sum[i] - sum[l]){
                for(int r = i;r <= m;++r,tmpr += sum[r]-sum[i]){
                    if(dp[1][l][r] == 0 || tmpl + tmpr < dp[1][l][r]) dp[1][l][r] = tmpl + tmpr;
                }
                tmpr = 0;
            }
        }
        for(int k = 2;k <= n;k++){
            for(int i = 1;i <= m;i++){
                for(int j = i;j <= m;j++){
                    tmp = min(dp[k-1][1][i-1]+dp[1][i][j],dp[k-1][1][i]+dp[1][i+1][j]);
                    if(dp[k][1][j] == 0 || dp[k][1][j] > tmp) 
                        dp[k][1][j] = tmp;
                }
            }
        }
        cout<<dp[n][1][m];
        return 0;
    }
  • 相关阅读:
    死磕Lambda表达式(四):常用的函数式接口
    死磕Lambda表达式(三):更简洁的Lambda
    死磕Lambda表达式(二):Lambda的使用
    死磕Lambda表达式(一):初识Lambda
    二叉树面试题:前中序求后序、中后序求前序
    五分钟后,你将真正理解MySQL事务隔离级别!
    详细解析Redis中的布隆过滤器及其应用
    详细解析Java虚拟机的栈帧结构
    面试真题:求100万内的质数
    C#-Xamarin的Android项目开发(一)——创建项目
  • 原文地址:https://www.cnblogs.com/hyfer/p/5811967.html
Copyright © 2011-2022 走看看