山区建小学(区间DP)
山区建小学
时间限制: 1 Sec 内存限制: 128 MB
提交: 17 解决: 5
[提交][状态][讨论版][命题人:quanxing]
题目描述
政府在某山区修建了一条道路,恰好穿越总共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 区间DP。f[n][m]表示1..n中建m个小学的最小花费。
一个结论:如果要在i..j中选一个点使所有点到这个点的总距离最小,这个点一定在中点位置。训练指南上有证明,其实很简单,反证法,假设不是中间的点,左移或右移一个点,会发现造价升高。 山区建小学不是《信息学奥赛一本通第5版》的例题,是noi官方题库的题目。
这题用动态规划来解决,这里需要一个辅助的数组dist,dist[i][j]表示在从i到j这一段区间建一所小学,i到j的村庄都到这个学校来上学的路程和。
分析:
这里采用之前讲到过的分析的方法来分析
状态表达:f[i][j]表示前i个村庄建j所学校,到里那个村庄最近的学校上学的路程和。
状态转移:
f[i][j]=min(f[i][j],f[k][j-1]+s[k+1][i]);
在前k个村庄造j-1个学校的最小和 + k+1到i个学校造一个学校的最小和
在前
详见代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int inf=;
int f[][];
int dis[][];//从i到j距离
int d[];
int s[][];
//s[管辖区起点][管辖区终点]=这片辖区内建一个学校,区内村庄到学校的距离和
int n,m;
int dist(int i,int j){
int x=;
int mid=(i+j)/;
for(int k=i;k<=j;k++)
x+=dis[k][mid];
return x;
} int main(){
scanf("%d%d",&m,&n);
int i,j,x;
for(i=;i<=m;i++){//从2开始,方便求各村庄间距离
scanf("%d",&x);
d[i]=d[i-]+x;
}
//
for(i=;i<=m;i++)
for(j=;j<=m;j++){
if(i==j)dis[i][j]=;
else dis[i][j]=dis[j][i]=abs(d[j]-d[i]);
}//初始化两两距离
//
for(i=;i<=m;i++)
for(j=;j<=m;j++)
s[i][j]=dist(i,j);
//计算一个管辖从i到j村庄的学校到这些村庄的距离和
//
for(i=;i<=m;i++)
for(j=;j<=m;j++)
f[i][j]=inf;
for(i=;i<=m;i++)f[i][i]=;
for(i=;i<=m;i++)f[i][]=s[][i];//只建一个学校的情况
//f初始化 /* //test
for(i=1;i<=m;i++)
for(j=1;j<=m;j++)
printf("%d ",s[i][j]);
*/
for(i=;i<=m;i++){//村庄
for(j=;j<=min(i,n);j++){//学校
for(int k=j-;k<=i-;k++){//枚举已有的学校管辖的范围
if(i!=j)f[i][j]=min(f[i][j],f[k][j-]+s[k+][i]);
}
}
}
printf("%d",f[m][n]); }
山区建小学(区间DP)的更多相关文章
- P4677 山区建小学|区间dp
P4677 山区建小学 题目描述 政府在某山区修建了一条道路,恰好穿越总共nn个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两个相邻的村庄之间的距离为di 为了提高山区 ...
- 【noi 2.6_7624】山区建小学(DP)
题意:在m个村庄建n个小学,求所有村到最近小学的距离总的最小值. 解法:由于题目是求"离最近的学校",而不是前一个学校,所以枚举学校的具体位置不方便,可转化成区间(学校居区间中间) ...
- 【OpenJudge7624】【区间DP】山区建小学
山区建小学 总时间限制: 1000ms 内存限制: 65536kB [描述] 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两 ...
- #DP# ----- OpenJudge山区建小学
没有记性.到DP不得不写博了,三天后又忘的干干净净.DP是啥 :-) 一道久到不能再久的题了. OpenJudge 7624:山区建小学 总时间限制: 1000ms 内存限制: 65536k ...
- 7624:山区建小学(划分dp)
7624:山区建小学 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄 ...
- NOI题库7624 山区建小学(162:Post Office / IOI2000 POST OFFICE [input] )
7624:山区建小学 Description 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两个相邻的村庄之间的距离为di(为 ...
- 山区建小学(区间dp+前缀和+预处理)
[题目描述] 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两个相邻的村庄之间的距离为di(为正整数),其中,0 < i ...
- luogu P4677 山区建小学 |dp
题目描述 政府在某山区修建了一条道路,恰好穿越总共nnn个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两个相邻的村庄之间的距离为did_idi(为正整数),其中,0& ...
- openjudge7624 山区建小学
描述 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两个相邻的村庄之间的距离为di(为正整数),其中,0 < i < ...
随机推荐
- ScreenOS地址转换
目录 1. NAT-src 1.1 来自DIP池(启用PAT)的NAT-src 1.2 来自DIP池(禁用PAT)的NAT-src 1.3 来自DIP池(带有地址变换)的NAT-src 1.4 来自出 ...
- linux设置系统时间与时区以及设置bios时间同步系统时间
有装过Linux系统的人,可能都会有这样的经历,就是该机器安装windows系统时,时间正确,但是安装了linux系统后,尽管时区选择正确,也会发现系统时间不对.这是由于安装系统时采用了UTC,那么什 ...
- springmvc文件上传的基本描述
SpringMVC的文件上传,底层也是使用的Apache的Commons-fileupload 可以分为三步: 1.导入依赖包 <!-- 文件上传的依赖 --> <dependenc ...
- 偏远小渔村选手的noip2017游记
这次noip估计是我初中最后一次比赛了,毕竟初三狗还要准备中考,要是中考挂了就GG了. 在最终成绩的榜上,我看到我成绩400,非常意外(你们这群大佬赛前天天奶我,还好不是毒奶),更意外的是全省竟然只有 ...
- 泛型学习第一天:List与IList的区别 (三)
已经有很多人讨论过IList和List的区别,恩,我也赞同其中的一些观点,其实他们二者也是有优有劣的,看你着重用在哪个方面,先贴一下我赞同的意见,基本上也都是网友们总结的. 首先IList 泛型接口是 ...
- Android 报错Android - Performing stop of activity that is not resumed
[原文] FROM STACKOVERFLOW: Just giving my 50 cents on the issue. Catching the exception is indeed one ...
- hdu 5890 Eighty seven 暴力+bitset优化背包
Eighty seven Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others) P ...
- poj 2116 Death to Binary? 模拟
Death to Binary? Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1707 Accepted: 529 D ...
- QT5 QtreeWidget 实现点击item事件以及右键菜单删除item 和 重命名item
1.new 一个QTreeWidget 对象,并设置头标签,和根节点(个人程序需要) QTreeWidget* treeWidget = ui.treeWidget;//我已经在ui设计师中拖了一个Q ...
- write.table函数语法:
write.table (x, file ="", sep ="", row.names =TRUE, col.names =TRUE, quote ...