题目链接

https://www.luogu.org/problemnew/show/P4677

分析

这道题方法跟之前题不一样,我们相当于枚举一个左右端点来线性扩展,同时划分断点进行决策

\(f[i][j]\)表示在前\(i\)个村庄中建立\(j\)个小学的最小距离总和

我们将枚举到第\(i\)个村庄作为阶段,修了\(j\)所小学作为状态,通过枚举断点\(k\)来分割第\(j\)所小学与前\(j-1\)所小学

也就是说我们判断\(f[k][j-1]\)加上将新加入的第\(j\)座小学建在后面的第\(k+1\)到第\(i\)座村庄中作出的贡献(也就是新产生的距离,我们假设\(f[k][j-1]\)已经是最优的)是否更优,那么怎么这个贡献怎么求呢呢?比较显然当小学建在\([k+1,i]\)中点处产生的新距离之和最小.为了快速求我们可以先预处理出来

状态转移

memset(f,0x3f,sizeof(f));
f[0][0]=0;
for(ri i=1;i<=n;i++){//枚举第几座村庄
for(ri j=1;j<=min(i,m);j++){//枚举修了多少小学
for(ri k=j-1;k<i;k++){//断点,枚举前j-1所小学都建在了[1,k]这个区间村庄内
f[i][j]=min(f[i][j],f[k][j-1]+dis[k+1][i]);
}
}
}

代码

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cctype>
#include <cmath>
#define ll long long
#define ri register int
using std::min;
using std::abs;
using std::max;
template <class T>inline void read(T &x){
x=0;int ne=0;char c;
while(!isdigit(c=getchar()))ne=c=='-';
x=c-48;
while(isdigit(c=getchar()))x=(x<<3)+(x<<1)+c-48;
x=ne?-x:x;return ;
}
const int maxn=505;
const int inf=0x7fffffff;
int f[maxn][maxn],s[maxn][maxn],dis[maxn][maxn];
int n,m,pos[maxn];
/*inline int dis(int l,int r){
int mid=(l+r)>>1,x=0;
for(ri i=l;i<=r;i++)x+=abs(pos[i]-pos[mid]);
return x;
}*/
int main(){
read(n),read(m);
for(ri i=2;i<=n;i++){
read(pos[i]);
pos[i]+=pos[i-1];
}
for(ri i=1;i<=n;i++){
for(ri j=i;j<=n;j++){
s[i][j]+=s[i][j-1]+pos[j];
}
}
for(ri l=1;l<=n;l++){
for(ri r=l;r<=n;r++){
int mid=(l+r)>>1;
dis[l][r]+=(mid-l)*pos[mid]-s[l][mid-1];
dis[l][r]+=s[mid+1][r]-(r-mid)*pos[mid];
}
}
memset(f,0x3f,sizeof(f));
f[0][0]=0;
for(ri i=1;i<=n;i++){//枚举第几座村庄
for(ri j=1;j<=min(i,m);j++){//枚举修了多少小学
for(ri k=j-1;k<i;k++){//断点,枚举前j-1所小学都建在了[1,k]这个区间村庄内
f[i][j]=min(f[i][j],f[k][j-1]+dis[k+1][i]);
}
}
}
printf("%d\n",f[n][m]);
return 0;
}

luogu4677山区建小学题解--区间DP的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. Blocks题解(区间dp)

    Blocks题解 区间dp 阅读体验...https://zybuluo.com/Junlier/note/1289712 很好的一道区间dp的题目(别问我怎么想到的) dp状态 其实这个题最难的地方 ...

  9. luogu P4677 山区建小学 |dp

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

随机推荐

  1. 【SpringBoot】SpringBoot/MyBatis/MySql/thymeleaf/Log4j整合工程

    工程下载地址:https://files.cnblogs.com/files/xiandedanteng/MMSpringWeb20191027-1.rar 工程目录结构如图: 1.创建工程 有些网文 ...

  2. 源码编译vi过程中进行配置时报“checking if compile and link flags for Python are sane... no: PYTHON DISABLED”怎么办?

    答: 需要安装python开发库(如果不安装这个库,那么在配置时执行./configure --enable-pythoninterp=yes将不会生效,以至于vi的python特性并没有被开启) 如 ...

  3. JDBC的工具类

    A: 抽取两个方法,一个获取Connection对象,一个是释放资源 import java.io.FileReader; import java.sql.Connection; import jav ...

  4. matllab 按照文件夹处理文件

    folders=dir('文件夹地址'); folders={folders.name}; folders=setdiff(folders,{'.','..'})'; num=length(folde ...

  5. Linux命令之iptables

    从CentOS7开始,系统自带的防火墙更改为firewalld,但同样支持iptables,不过只有iptables命令,如果想要使用iptables服务需要自行安装iptables-server. ...

  6. JAVA 基础编程练习题47 【程序 47 打印星号】

    47 [程序 47 打印星号] 题目:读取 7 个数(1—50)的整数值,每读取一个值,程序打印出该值个数的*. package cskaoyan; public class cskaoyan47 { ...

  7. Centos 6.8环境下OpenLDAP安装与部署

    一.OpenLDAP介绍 LDAP 全称轻量级目录访问协议(英文:Lightweight Directory Access Protocol),是一个运行在 TCP/IP 上的目录访问协议.LDAP实 ...

  8. Spring Boot后台运行

    #!/bin/bash nohup java -jar -Dspring.profiles.active=prop app-0.0.1.jar > app.log 2>&1 &am ...

  9. 记录一下自己安装Appium的流程

    跟着其他大佬的安装攻略,一步一步来的.过程中遇到了一些问题,也都解决了~ 需要准备的东西: 1.JDK1.8 2.Andriod SDK 3.Node.js 4.Python 5.Appium-pyt ...

  10. OpenCV.CV_FOURCC

    1.c++ - how to use CV_CAP_PROP_FOURCC_ - Stack Overflow.html(https://stackoverflow.com/questions/223 ...