【OpenJudge - noi - 7624】山区建小学(dp)

题干:

总时间限制: 

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

解题报告:

   dp[i][j]代表前i个村庄建立了j所小学的最小距离。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e5 + 5;
const int INF = 0x3f3f3f3f;
//从m个村中选择n个村建小学(设 0 < n < = m < 500 )
int dis[555][555];
int f[555][555];
int dp[555][555];//dp[i][j] 代表前i个村庄创建n个j个学校的最小距离。
int go(int i,int j) {int mid = (i+j)>>1;int res = 0;for(; i<=j; i++) res += dis[i][mid];return res;
}
int n,m;
int main() {cin>>m>>n;for(int i = 1; i<=m; i++) dis[i][i] = 0;for(int x,i = 2; i<=m; i++) {scanf("%d",&x);dis[i-1][i] = dis[i][i-1] = x;//其实这一句可以合并到下面,因为你dis[i][i]=0了。。for(int j = 1; j<i; j++) {dis[j][i] = dis[j][i-1] + x;dis[i][j] = dis[j][i];}}for(int i = 1; i<=m; i++) {for(int j = 1; j<=m; j++) {f[i][j] = go(i,j);}}memset(dp,INF,sizeof dp);for(int i = 1; i<=m; i++) dp[i][1] = f[1][i];for(int i = 2; i<=m; i++) {for(int j = 2; j<=n; j++) {if(j > i) continue;for(int k = 1; k<i; k++) {dp[i][j] = min(dp[i][j],dp[k][j-1] + f[k+1][i]);}}}printf("%d\n",dp[m][n]);return 0 ;
}
//19:11 - 19:28

简化一点的:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e5 + 5;
const int INF = 0x3f3f3f3f;
//从m个村中选择n个村建小学(设 0 < n < = m < 500 )
int sum[555];
int f[555][555];
int dp[555][555];//dp[i][j] 代表前i个村庄创建n个j个学校的最小距离。
int go(int i,int j) {int mid = (i+j)>>1;int res = 0;for(; i<=j; i++) res += abs(sum[mid]-sum[i]);return res;
}
int n,m;
int main() {cin>>m>>n;for(int x,i = 2; i<=m; i++) {scanf("%d",&x);sum[i] = sum[i-1] + x;//边的前缀和 }for(int i = 1; i<=m; i++) {for(int j = 1; j<=m; j++) {f[i][j] = go(i,j);}}memset(dp,INF,sizeof dp);for(int i = 1; i<=m; i++) dp[i][1] = f[1][i];for(int i = 2; i<=m; i++) {for(int j = 2; j<=n; j++) {if(j > i) continue;for(int k = j-1; k<i; k++) {dp[i][j] = min(dp[i][j],dp[k][j-1] + f[k+1][i]);}}}printf("%d\n",dp[m][n]);return 0 ;
}
//19:11 - 19:28

或者分治:(但是这个耗时400ms??上面那个dp只有100多ms)

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define rep(i,a,b) for(int i=a;i<b;i++)
using namespace std;
const int MAX = 2e5 + 5;const ll INF=1e15;
int a[MAX];
ll dp[MAX],ndp[MAX],s[MAX];
ll cal(int l,int r) {return s[r]+s[l-1]-s[(l+r-1)/2]-s[(l+r)/2];
}
void solve(int l,int r,int p,int q) {if(l>r)return;int m=(l+r)>>1,x=p;ndp[m]=INF;for(int i = p; i<=q; i++) {ll w=dp[i]+cal(i+1,m);if(ndp[m]>w) {ndp[m]=w;x=i;}}if(l<r) {solve(l,m-1,p,x);solve(m+1,r,x,q);}
}
int main() {int T,ca=0,k,i,j,m=0,K,n;scanf("%d%d",&n,&K);K = min(K,n);a[1]=0;for(int i = 2; i<=n; i++) {int q;scanf("%d",&q);a[i] = a[i-1] + q;}sort(a+1,a+n+1);for(int i = 1; i<=n; i++)s[i]=s[i-1]+a[i];for(int i = 1; i<=n; i++) dp[i]=INF;for(int i = 1; i<=K; i++) {solve(1,n,0,n);swap(dp,ndp);}printf("%lld\n",dp[n]);return 0 ;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nuc8i7beh安装linux随机重启,【图片】来分享一下我的NUC8I7BEH【intelnuc吧】_百度贴吧...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼测试来了&#xff0c;Linux 脚本&#xff0c;2G测试&#xff0c;操完这次以后休息俩礼拜。ssd随机读4kfio -filename./ran4K.log -direct1 -iodepth 1 -thread -rwrandread -ioenginepsync -bs4k -size2G -numjobs10 -runtime1000 …

【Codeforces - 找不到题号】三元环计数(bitset优化,压位)

题干&#xff1a; 给你一个二维字符矩阵&#xff0c;如果 ( i , j ) 为 表明 两点之间有一条有向边&#xff0c;为-表示没有边&#xff0c;那么你要找出所有的三元环的个数。顶点数N<1500。 解题报告&#xff1a; 考虑最暴力的方法&#xff0c;开个二维数组来存每两个顶点之…

自定义函数删除字母C语言,[编程入门]自定义函数之字符提取-题解(C语言代码)...

解题思路:输入一个字符串&#xff0c;调用函数&#xff0c;遍历字符串中每一个字符&#xff0c;看是否含有aeiou字符&#xff0c;若有&#xff0c;将其保存到另一个字符型数组中&#xff0c;在主函数中对得到的字符型数组进行排序&#xff0c;输出。注意事项:题目要求顺序输出元…

【Hihocoder - offer编程练习赛39 - D】前缀后缀查询(后缀字典树,哈希,思维)

题干&#xff1a; 时间限制:10000ms 单点时限:1000ms 内存限制:512MB 描述 给定一个包含N个单词的字典:{W1, W2, W3, ... WN}&#xff0c;其中第i个单词Wi有具有一个权值Vi。 现在小Hi要进行M次查询&#xff0c;每次查询包含一个前缀字符串Pi和一个后缀字符串Si。他希望…

c 语言 while break,26 C 语言中的break和continue - C 语言基础教程

循环语句很好用&#xff0c;但是如果循环进行到一般想要跳出循环或者结束循环怎么办&#xff1f;那么那你需要 break 和 continue 语句。1. break 和 continue 的使用语法1.1 or 循环中使用 break 和 continuebreakfor (控制循环的变量; 循环判断条件; 循环变量增减变化){语句1…

【牛客 - 21302】被3整除的子序列(线性dp)

题干&#xff1a; 给你一个长度为50的数字串,问你有多少个子序列构成的数字可以被3整除 答案对1e97取模 输入描述: 输入一个字符串&#xff0c;由数字构成&#xff0c;长度小于等于50 输出描述: 输出一个整数 示例1 输入 复制 132 输出 复制 3 示例2 输入 复制 …

c语言链表实现数组逆置,数组与链表等顺序表逆置

一)数组的逆置(1)算法#indclude#define N 8main(){int array[N] {100,90,80,70,60,50,50,40};int i,j,t;for(i0,jN-1;i{t array[i];array[i] array[j];array[j] t;}for(i0,iprintf("%d",qlist.data[i])}(2)时间复杂度由于只需循环N/2即可完成逆置,所以时…

linux系统get命令详解,Ubuntu Linux系统下apt-get命令详解

整理了Ubuntu Linux操作系统下apt-get命令的详细说明,分享给大家。常用的APT命令参数&#xff1a;apt-cache search package 搜索包apt-cache show package 获取包的相关信息&#xff0c;如说明、大小、版本等sudo apt-get install package 安装包sudo apt-get install package…

*【Hihocoder - offer编程练习赛94 - A】最短管道距离(中位数)

题干&#xff1a; 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在一张2D地图上有N座城市&#xff0c;坐标依次是(X1, Y1), (X2, Y2), ... (XN, YN)。 现在H国要修建一条平行于X轴的天然气主管道。这条管道非常长&#xff0c;可以认为是一条平行于X轴的直线。…

android开发百度地图坐标偏差,利用百度地图Android sdk高仿微信发送位置功能及遇到的问题...

接触了百度地图开发平台半个月了&#xff0c;这2天试着模仿了微信给好友发送位置功能&#xff0c;对百度地图的操作能力又上了一个台阶我在实现这个功能的时候&#xff0c;遇到一些困难&#xff0c;可能也是别人将会遇到的困难&#xff0c;特在此列出1、在微信发送功能中&#…

*【牛客 1 - A】矩阵(字符串hash)

题干&#xff1a; 给出一个n * m的矩阵。让你从中发现一个最大的正方形。使得这样子的正方形在矩阵中出现了至少两次。输出最大正方形的边长。 输入描述: 第一行两个整数n, m代表矩阵的长和宽&#xff1b; 接下来n行&#xff0c;每行m个字符&#xff08;小写字母&#xff…

*【洛谷 - P1025】数的划分(dfs 或 dp 或 母函数,第二类斯特林数Stirling)

题干&#xff1a; 题目描述 将整数n分成k份&#xff0c;且每份不能为空&#xff0c;任意两个方案不相同(不考虑顺序)。 例如&#xff1a;n7&#xff0c;k3&#xff0c;下面三种分法被认为是相同的。 1,1,5 1,5,1 5,1,1 问有多少种不同的分法。 输入输出格式 输入格式&am…

kali linux 截图 软件,Kali-Linux-Tools-Interface:针对Kali Linux的图形化Web接口

Kali-Linux-Tools-Interface在当今这个信息时代&#xff0c;数据是最有价值的资产&#xff0c;因此&#xff0c;广大用户和企业已成为网络攻击的主要目标。众所周知&#xff0c;信息安全专业人员都会使用一系列技术工具来协助他们的活动。但是设置环境&#xff0c;安装这些工具…

【牛客 - 188D 】愤怒(01滚动数组优化dp,括号匹配方案个数,tricks)

题干&#xff1a; 小w很生气 小w有一个长为n的括号序列 愤怒小w想把这个括号序列分为两个括号序列 小w想让分为的这两个括号序列同时合法 小w想知道一共有多少种划分方案 (划分的意思是划分为两个子序列) 注意两个序列是 A,B 和 两个序列是B,A 算两种方案,也就是同一位置位…

android adb 开机广播,Android中常用的adb指令

1、安装apkadb install filename.apk如:adb install C:\Users\zhijianhulian\Desktop\keystore\kingoroot.apk2、卸载apkadb uninstall apk包名如&#xff1a;adb uninstall com.kingoroot.cn3、启动activityadb shell am start -n 包名/activity完整包名地址如&#xff1a;adb…

ACM所有算法大全(持续更新)

转载自&#xff1a; http://blog.sina.com.cn/s/blog_adb6743801019h29.html ACM 所有算法 数据结构 栈&#xff0c;队列&#xff0c;链表哈希表&#xff0c;哈希数组堆&#xff0c;优先队列 双端队列 可并堆 左偏堆二叉查找树 Treap 伸展树并查集 集合计数问题 二分图的识别平…

android布局属性,Android 布局学习之——LinearLayout属性baselineAligned的作用及baseline...

相信大家对LinearLayout已经相当熟悉&#xff0c;但你们是否了解它的属性baselineAligned呢&#xff1f;Android官方文档是这么描述的&#xff1a;那到底这个属性是做什么用的呢&#xff1f;baselineAligned:基准线对齐。首先要解释什么是基准线&#xff0c;这个在中文中不常见…

【CodeForces - 1105C】Ayoub and Lost Array(线性计数dp)

题干&#xff1a; Ayoub had an array aa of integers of size nn and this array had two interesting properties: All the integers in the array were between ll and rr (inclusive).The sum of all the elements was divisible by 33. Unfortunately, Ayoub has lost h…

【牛客 - 373C】抓捕盗窃犯(连通图,思维,dfs 或 并查集)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/373/C 来源&#xff1a;牛客网 Q市发生了一起特大盗窃案。这起盗窃案是由多名盗窃犯联合实施的,你要做的就是尽可能多的抓捕盗窃犯。 已知盗窃犯分布于 N N个地点,以及第 i i个地点初始有 ai ai名盗…

android取消自动调试模式吗,Android进入调试模式的三种技巧

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;Android开发过程中难免会遇到各种问题&#xff0c;通常我们会通过打印Log日志或者Debug模式来分析问题。这里介绍下Android程序进入到Debug的多种方式&#xff0c;…