OpenJudge 7624 山区建小学
在openjudge似乎无法凭题号搜到题...?
- 总时间限制:
- 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右边的村庄全部应该受a学校管辖(想一想,为什么),结点左边的学校则需要枚举判断了。
在决策结点a的学校之前,我们应该已经决策了另外一些已建好的学校,它们的决策方式和上面是相同的。
假设我们已经决策过i-1个村庄是否建了学校,正在决策第i个,之前建好的学校管辖范围是1~k,那么新学校的管辖范围应该是k+1~m,(k的范围是"已有学校数"~m-1)
设f[决策的村庄数][建的小学数]=题目要求的距离,s[管辖区起点][管辖区终点]=这片辖区内建一个学校,区内村庄到学校的距离和。
f[i][j]=min(f[i][j],f[k][j-1]+s[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]); }
OpenJudge 7624 山区建小学的更多相关文章
- Openjudge — 7624 山区建小学
问题描述 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两个相邻的村庄之间的距离为di(为正整数),其中,0 < i & ...
- NOI题库7624 山区建小学(162:Post Office / IOI2000 POST OFFICE [input] )
7624:山区建小学 Description 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两个相邻的村庄之间的距离为di(为 ...
- 7624:山区建小学(划分dp)
7624:山区建小学 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄 ...
- #DP# ----- OpenJudge山区建小学
没有记性.到DP不得不写博了,三天后又忘的干干净净.DP是啥 :-) 一道久到不能再久的题了. OpenJudge 7624:山区建小学 总时间限制: 1000ms 内存限制: 65536k ...
- 山区建小学(区间DP)
山区建小学 时间限制: 1 Sec 内存限制: 128 MB提交: 17 解决: 5[提交][状态][讨论版][命题人:quanxing] 题目描述 政府在某山区修建了一条道路,恰好穿越总共m个村 ...
- 【OpenJudge7624】【区间DP】山区建小学
山区建小学 总时间限制: 1000ms 内存限制: 65536kB [描述] 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两 ...
- P4677 山区建小学|区间dp
P4677 山区建小学 题目描述 政府在某山区修建了一条道路,恰好穿越总共nn个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两个相邻的村庄之间的距离为di 为了提高山区 ...
- 山区建小学(区间dp+前缀和+预处理)
[题目描述] 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两个相邻的村庄之间的距离为di(为正整数),其中,0 < i ...
- openjudge7624 山区建小学
描述 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两个相邻的村庄之间的距离为di(为正整数),其中,0 < i < ...
随机推荐
- java 12-1 StringBuffer类
线程安全(多线程讲解) 安全 -- 同步 -- 数据是安全的--效率低一些 不安全 -- 不同步 -- 数据不安全--效率高一些 安全和效率问题是永远困扰我们的问题. 安全:医院的网站,银行网站 效率 ...
- SQLite 解决:Could not load file or assembly 'System.Data.SQLite ... 试图加载格式不正确的程序/or one of its dependencies. 找不到指定的模块。
Could not load file or assembly 'System.Data.SQLite.dll' or one of its dependencies. 找不到指定的模块. 错误提示 ...
- 什么是multipart/form-data请求
根据http/1.1 rfc 2616的协议规定,我们的请求方式只有OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE等,那为为何我们还会有multipart/form-da ...
- Maven 的 HelloWorld
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- PPPOE原理及部署
PPPOE 1,一个广播域 2,panabit可以做小区项目 http://edu.51cto.com/course/course_id-3849.html Adsl的介绍 所谓非对称,即上下行速 ...
- c# nullable类型有什么用
可空类型,语法: ; int? inully = 10; Nullable<int> inullx0 = null; int? inully0 ...
- 可以ping通的打印机,没有办法打印
可以ping通打印机的电脑,但是访问不了打印机的共享设置.\\XXX.XXX.XXX.XXX 之后出现如下错误: 您可能没有权限使用网络资源.请与这台服务器的管理员联系以查明您是否有访问权限.目前没 ...
- Winform调用百度地图接口
using System; using System.IO; using System.Collections.Generic; using System.ComponentModel; using ...
- Java的动态代理(dynamic proxy)
什么是动态代理(dynamic proxy) 动态代理(以下称代理),利用Java的反射技术(Java Reflection),在运行时创建一个实现某些给定接口的新类(也称“动态代理类”)及其实例(对 ...
- memcached工作原理与优化建议
申明,本文为转载文:http://my.oschina.net/liuxd/blog/63129 工作原理 基本概念:slab,page,chunk. slab,是一个逻辑概念.它是在启动memcac ...