1197:山区建小学

1197:山区建小学

时间限制: 1000 ms         内存限制: 65536 KB
提交数: 1244     通过数: 844 
【题目描述】
政府在某山区修建了一条道路,恰好穿越总共
m
m
个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往。已知任意两个相邻的村庄之间的距离为
d
i
di
(为正整数),其中,
0<i<m
0<i<m
。为了提高山区的文化素质,政府又决定从
m
m
个村中选择
n
n
个村建小学(设
0<n≤m<500
0<n≤m<500
)。请根据给定的
m
m
、
n
n
以及所有相邻村庄的距离,选择在哪些村庄建小学,才使得所有村到最近小学的距离总和最小,计算最小值。
【输入】
第1行为
m
m
和
n
n
,其间用空格间隔
第2行为
m−1
m−1
 个整数,依次表示从一端到另一端的相邻村庄的距离,整数之间以空格间隔。
例如:

10 3
2 4 6 5 2 4 3 1 3

表示在
10
10
个村庄建
3
3
所学校。第
1
1
个村庄与第
2
2
个村庄距离为
2
2
,第
2
2
个村庄与第
3
3
个村庄距离为
4
4
,第
3
3
个村庄与第
4
4
个村庄距离为
6
6
,...,第
9
9
个村庄到第
10
10
个村庄的距离为
3
3
。

【输出】
各村庄到最近学校的距离之和的最小值。
【输入样例】
10 2
3 1 3 1 1 1 1 1 3
【输出样例】
18
1197山区建小学

dp[i][j]:表示在1~i个村庄中建j个小学时的路径最小值 m[i][j]:表示从i到j只建立一个小学的路径的最小值若从第i个村庄到第j个村庄只选取一个作为小学的话则选择第(i+j)/2个一开始我没懂,直到自己画了个图,假设把在5建的小学移到4,则其他村庄的距离变化如图,从4到3不会变化,所以除法向下取整不会有问题。则状态转移方程:m[i][j]=m[i][j-1]+a[i]-a[(i+j)/2]怎么理解呢?1)i+j为偶数,有以下序列,此时在2建小学    1 2 3    新加一个村庄,此时还是在2建小学    1 2 3 4    则m[1][4]=m[1][3]+(4到2的距离)a[4]-a[(1+4)/2]2)i+j为奇数,有以下序列,此时在2建小学    1 2 3 4    新加一个村庄,此时在3建小学。根据之前画的图,村庄仅有1~4时,在2、3建小学都是路径最小值,m[1][4]不会变化    1 2 3 4 5    则m[1][4]=m[1][3](小学位置变了但是值不变)+(5到3的距离)a[5]-a[(1+5)/2]所以得:初始化:dp[i][1]=m[1][i]dp[i][j]=min{dp[k][j-1]+m[k+1][i]}(1<=k<i)
---------------------
作者:Always_ease
来源:CSDN
原文:https://blog.csdn.net/Always_ease/article/details/80527234
版权声明:本文为博主原创文章,转载请附上博文链接!

a[i]为每一个山区的位置
mi[i][j],i到j之间建一个小学的路程

dp[i][j],1~i之间建了j个小学

注意:
1、不要忘记初始化:dp[i][1]=mi[1][i]
2、要保证状态转移方程中每一项都已算出来
     k>=j-1,k+1<=i,j-1>=1即j>=2

区间DP我也不太懂,先转过来,以留后用。

猜你喜欢

转载自www.cnblogs.com/wendcn/p/10664337.html