7624:山区建小学

xiaoxiao2021-02-28  99

#include<iostream> using namespace std; int d[501] = {0}; int sumd[501] = {0}; int f[501][501]; int cut[501][501]; int main() { int m, n, i, j, k; cout<<"Input m and n\n"; cin>>m>>n; cout<<"Input distanc\n"; for(i=2; i<=m; i++) { cin>>d[i]; //d[i]表示从i-1村到i村的距离 sumd[i] = sumd[i-1] + d[i]; //sumd[i]表示从1村到i村的距离之和 } for(i=1; i<=m; i++) { for(j=1; j<=n; j++) { f[i][j] = INT_MAX; } } for(i=1; i<=m; i++) //cut[i][j]表示从i村到j村建一座小学的最近距离之和 { for(j=1; j<=m; j++) { int s = (i+j) / 2; for(k=i; k<s; k++) cut[i][j] += sumd[s] - sumd[k]; for(k=s; k<=j; k++) cut[i][j] += sumd[k] - sumd[s]; // cout<<cut[i][j]<<"\t"; } } for(i=1; i<=m; i++) f[i][1] = cut[1][i]; //f[i][j]表示前i个村庄建j个小学的最短距离之和 for(i=1; i<=m; i++) { for(j=2; j<=n; j++) { for(k=1; k<i; k++) f[i][j] = min(f[i][j], f[k][j-1]+cut[k+1][i]); } } cout<<f[m][n]; return 0; }

7624:山区建小学

Description

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

Input

第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。

Output

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

Sample Input

10 2

3 1 3 1 1 1 1 1 3

Sample Output

18

 

转载请注明原文地址: https://www.6miu.com/read-51197.html

最新回复(0)