• TZOJ5942: 山区建小学(二维dp+枚举)


    描述

     

    政府在某山区修建了一条道路,恰好穿越总共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。

     

    输出

     

    各村庄到最近学校的距离之和的最小值。

    样例输入

     

    样例输出

     

    题目来源

    TZOJ

     

    做为蒟蒻写这样的dp题简直惨不忍睹

    dalao讲的很详细虽然我还是有点懵(菜是原罪)

    参考博客

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 int m,n;
     5 const int N=505,INF=0x3f3f3f3f;
     6 ///a[i][j]村庄i到j距离,c[i][j]村庄i到j建学校的最短距离和,dp[i][j]第1-i村庄建j所学校最短距离和
     7 int a[N][N],c[N][N],dp[N][N];
     8 
     9 int main(){
    10     cin>>m>>n;
    11     for(int i=1;i<m;i++){
    12         cin>>a[i][i+1];
    13     }
    14     ///类似floyed算法
    15     for(int i=1;i<=m;i++){
    16         for(int j=i+1;j<=m;j++){
    17             a[i][j]=a[j][i]=a[i][j-1]+a[j-1][j];
    18         }
    19     }
    20     ///中间建学校路更短
    21     for(int i=1;i<=m;i++){
    22         for(int j=i+1;j<=m;j++){
    23             int mid=(i+j)/2;
    24             for(int k=i;k<=j;k++){
    25                 c[i][j]+=a[k][mid];
    26             }
    27         }
    28     }
    29     ///初始1-i村建1所学校即为c[1][i]
    30     for(int i=1;i<=m;i++){
    31         dp[i][1]=c[1][i];
    32     }
    33     for(int i=1;i<=m;i++){
    34         for(int j=2;j<=n;j++){
    35             dp[i][j]=INF;
    36             for(int k=j-1;k<=i;k++){
    37                 dp[i][j]=min(dp[i][j],dp[k][j-1]+c[k+1][i]);
    38             }
    39         }
    40     }
    41     cout<<dp[m][n]<<endl;
    42 }
  • 相关阅读:
    [kuangbin带你飞]专题十六 KMP & 扩展KMP & ManacherK
    [kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher J
    [kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher I
    pat 1065 A+B and C (64bit)(20 分)(大数, Java)
    pat 1069 The Black Hole of Numbers(20 分)
    pat 1077 Kuchiguse(20 分) (字典树)
    pat 1084 Broken Keyboard(20 分)
    pat 1092 To Buy or Not to Buy(20 分)
    pat 1046 Shortest Distance(20 分) (线段树)
    pat 1042 Shuffling Machine(20 分)
  • 原文地址:https://www.cnblogs.com/ChangeG1824/p/11379993.html
Copyright © 2020-2023  润新知