在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 山区建小学的更多相关文章

  1. Openjudge — 7624 山区建小学

    问题描述 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两个相邻的村庄之间的距离为di(为正整数),其中,0 < i & ...

  2. NOI题库7624 山区建小学(162:Post Office / IOI2000 POST OFFICE [input] )

    7624:山区建小学 Description 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两个相邻的村庄之间的距离为di(为 ...

  3. 7624:山区建小学(划分dp)

    7624:山区建小学 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄 ...

  4. #DP# ----- OpenJudge山区建小学

    没有记性.到DP不得不写博了,三天后又忘的干干净净.DP是啥 :-) 一道久到不能再久的题了. OpenJudge  7624:山区建小学 总时间限制: 1000ms     内存限制: 65536k ...

  5. 山区建小学(区间DP)

    山区建小学 时间限制: 1 Sec  内存限制: 128 MB提交: 17  解决: 5[提交][状态][讨论版][命题人:quanxing] 题目描述 政府在某山区修建了一条道路,恰好穿越总共m个村 ...

  6. 【OpenJudge7624】【区间DP】山区建小学

    山区建小学 总时间限制: 1000ms 内存限制: 65536kB [描述] 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两 ...

  7. P4677 山区建小学|区间dp

    P4677 山区建小学 题目描述 政府在某山区修建了一条道路,恰好穿越总共nn个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两个相邻的村庄之间的距离为di 为了提高山区 ...

  8. 山区建小学(区间dp+前缀和+预处理)

    [题目描述] 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两个相邻的村庄之间的距离为di(为正整数),其中,0 < i ...

  9. openjudge7624 山区建小学

    描述 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两个相邻的村庄之间的距离为di(为正整数),其中,0 < i < ...

随机推荐

  1. Spring 中注入 properties 中的值

    <bean id="ckcPlaceholderProperties" class="org.springframework.beans.factory.confi ...

  2. Android优化——UI优化(五) Listview 重用convertView

    1.重用convertView 我们对convertView添加判断,如果存在我们就直接使用,否则初始化一个convertView的实例.(如下图) 2.使用viewHolder 使用viewHold ...

  3. mysqli常用错误处理函数

    mysqli扩展库包含三个类库,分别是mysqli连接库,mysqli_result处理结果集库和预处理库: 当使用select语句返回的结果集就是mysqli_result类库的对象,所以就可以用这 ...

  4. 谈谈Git的忽略规则.gitignore

    对于经常使用Git的朋友来说,.gitignore配置一定不会陌生. 今天就来说说这个.gitignore的使用. 首先要强调一点,这个文件的完整文件名就是“.gitignore”,注意最前面有个“. ...

  5. f2fs源码分析之文件读写过程

    本篇包括三个部分:1)f2fs 文件表示方法: 2)NAT详细介绍:3)f2fs文件读写过程:4) 下面详细阐述f2fs读写的过程. 管理数据位置关键的数据结构是node,node包括三种:inode ...

  6. 14Mybatis_输入映射(传递pojo的包装对象)——很重要

    假设我们有这么一个需求:用户信息的综合查询,需要传入的查询条件很复杂(可能包括用户信息,其他的信息,比如商品,订单) 我们的思想是:传入到select中的parameterType是一个包装类,里面可 ...

  7. ie6,ie7兼容性总结(转)

    其实浏览器的不兼容,我们往往是各个浏览器对于一些标准的定义不一致导致的,因此,我们可以进行一些初始化,很多问题都很轻松解决. 下面是14条特殊情况仅供参考: 1. 文字本身的大小不兼容.同样是font ...

  8. iBatis.net入门指南

    iBatis.net入门指南    - 1 - 什么是iBatis.net ?    - 3 - iBatis.net的原理    - 3 - 新人指路    - 3 - iBatis.net的优缺点 ...

  9. QuickFIX/J常见问题汇总

    最近在搞QuickFIX/J,网上的资料不算很多,遇到一些简单的问题都需要google一阵才能找到解决方法,因此做点记录: 错误:Rejecting invalid message: quickfix ...

  10. JS 之原型,实例,构造函数之间的关系

    JS是面向对象的语言,函数也是对象.下面大致介绍下实例,原型与构造函数之间的关系. 构造函数模式 function Person(name,age){ this.name = name; this.a ...