#DP# ----- OpenJudge山区建小学
没有记性。到DP不得不写博了,三天后又忘的干干净净。DP是啥 :-)
一道久到不能再久的题了。
OpenJudge 7624:山区建小学
- 总时间限制: 1000ms 内存限制: 65536kB
- 描述
-
政府在某山区修建了一条道路,恰好穿越总共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 因为所求为距离和最小,所以发现选择一个点a建立学校后,以a为中心向两边扩散下一个点所走的距离d=d(前一个点)+d(当前);期望重复次数越多路段d越小。然后,就有dalao证明了区间[i,j]中在中点处建学校路段和为最小(建1所学校);脑洞又开到:如果区间内点数为偶数,如何选择中点?手推数据发现其实都是一样的。在此计算的为距离和,所以实则计算的是 d总+=di*重复次数。如图:

考虑DP:从第一个村庄开始扩展,在区间[1,i],每加入一个点i进行决策 。
状态转移方程:f[i][j]=min(f[i][j],f[k][j-1]+w[k+1][i]);
f[i][j] 表示到第i个点建j所学校的最优;在区间[1.i]间枚举断点,断点前为在区间[1,k]建j-1所学校的最优,断点后为在区间[k+1,i]建1所学校的最优。
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std; int n,m;
int d[][],f[][],w[][],s[]; int pre(int a,int b){
int x=;
int mid=(a+b)>>;
for(int i=a;i<=b;++i)
x+=d[i][mid];
return x;
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i){//s[i]---第i-1个村庄到第i个村庄间的距离
int x;
scanf("%d",&x);
s[i]=s[i-]+x;
}
memset(f,0x3f3f3f,sizeof(f));
for(int i=;i<=n;++i){
f[i][i]=;
for(int j=;j<=n;++j){
if(i==j)d[i][j]=;
d[i][j]=d[j][i]=abs(s[i]-s[j]);//(i,j)间的距离
}
}
for(int i=;i<=n;++i)//(i,j)建1所小学min
for(int j=i+;j<=n;++j)
w[i][j]=pre(i,j);
for(int i=;i<=n;++i)f[i][]=w[][i];
for(int i=;i<=n;++i)// 村庄
for(int j=;j<=min(i,m);++j)//j---学校 min(枚举的村庄数,学校数)
for(int k=j-;k<i;++k)//min( f[i][j],建j-1所学校所达范围(1,k)+新建第j所学校范围(k+1,i))
if(i!=j)f[i][j]=min(f[i][j],f[k][j-]+w[k+][i]); printf("%d",f[n][m]);
return ;
}
#DP# ----- OpenJudge山区建小学的更多相关文章
- 【OpenJudge7624】【区间DP】山区建小学
山区建小学 总时间限制: 1000ms 内存限制: 65536kB [描述] 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两 ...
- 山区建小学(区间DP)
山区建小学 时间限制: 1 Sec 内存限制: 128 MB提交: 17 解决: 5[提交][状态][讨论版][命题人:quanxing] 题目描述 政府在某山区修建了一条道路,恰好穿越总共m个村 ...
- P4677 山区建小学|区间dp
P4677 山区建小学 题目描述 政府在某山区修建了一条道路,恰好穿越总共nn个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两个相邻的村庄之间的距离为di 为了提高山区 ...
- 7624:山区建小学(划分dp)
7624:山区建小学 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄 ...
- NOI题库7624 山区建小学(162:Post Office / IOI2000 POST OFFICE [input] )
7624:山区建小学 Description 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两个相邻的村庄之间的距离为di(为 ...
- 山区建小学(区间dp+前缀和+预处理)
[题目描述] 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两个相邻的村庄之间的距离为di(为正整数),其中,0 < i ...
- OpenJudge 7624 山区建小学
在openjudge似乎无法凭题号搜到题...? 总时间限制: 1000ms 内存限制: 65536kB 描述 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任 ...
- luogu P4677 山区建小学 |dp
题目描述 政府在某山区修建了一条道路,恰好穿越总共nnn个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两个相邻的村庄之间的距离为did_idi(为正整数),其中,0& ...
- Openjudge — 7624 山区建小学
问题描述 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两个相邻的村庄之间的距离为di(为正整数),其中,0 < i & ...
随机推荐
- 怎样把人物处理的清晰PS教程
首先打开PS软件,导入一张人物图片 然后复制图层,点滤镜---杂色----减少杂色 点高级 点确定. 点图像-----调整-----匹配颜色在点一下中和,中和看图效果,也可点 也可不点 切记,然后确定 ...
- 触发器(基本的SR触发器、同步触发器、D触发器)
一.能够存储1位二值信号的基本单元电路统称为触发器(Filp-Flop) 触发器是构成时序逻辑电路的基本逻辑部件.它有两个稳定状态:“0”和“1”.在不同的输入情况下,它可以被置0状态或1状态,当输入 ...
- 强制修改mysql 中root的密码
/etc/init.d/mysqld stop (service mysqld stop )/usr/bin/mysqld_safe --skip-grant-tables另外开个SSH连接[ro ...
- DBNull.value
判断某一个datarow的cell是否有值需要进行两步判断 1.dr["field_name"]!=DBNull.value&&dr["field_nam ...
- Visual C++ 6.0 解决win 8.1不兼容的问题。--技术宅从来不妥协
因为目标院校复试上机需要使用这一个软件,所以在成功的路上的遇到的问题记录,避免二次犯错,在网站上下载并且安装Visual C++ 6.0,运行时会提示不兼容的问题,怎么办呢?当然不是下载他们所推荐的V ...
- SpingMvc 中文乱码 post 方式解决方案
Web.xml <!-- spring 中文乱码问题 --> <filter> <filter-name>encodingFilter</filter-nam ...
- Spring自学教程-jabc编程详解、RowMapper使用(三)
一.JDBC 1.JDBC的编程特点 静态代码+动态变量 = jdbc编程.在spring中动态变量可以用注入的形式给予.这样的编程方式适合包装成模板.静态代码构成了模板,而动态变量则是需要传入的参数 ...
- layer 的一些知识
layer类似于ps的图层,如果把一个uiview看做图片的画,layer就像是图层.一个图片是由很多个大小不同的有层次的图层构成的,uiview也是. 1. 一个view有一个underlying ...
- 《javascript语言精粹》——第3章对象
第三章:对象: 属性名字:可以是包括空字符串在内的任意字符串: 属性值:是除undefined值之外的任何值; [1].对象字面量: var obj={}; //空对象 var obj = new O ...
- iOS开发——代理与block传值
一.代理传值的方法 1.Hehe1ViewController.h中 #import <UIKit/UIKit.h> @protocol Hehe1ViewControllerDelega ...