题意:在m个村庄建n个小学,求所有村到最近小学的距离总的最小值。

解法:由于题目是求“离最近的学校”,而不是前一个学校,所以枚举学校的具体位置不方便,可转化成区间(学校居区间中间)的划分问题。

实现:dis[l][r]存村庄l和村庄r之间建1个小学的最小距离和,即到中间那个村庄的距离和。f[i][j]表示前i个村庄建了j个小学的最小距离和。

 1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4
5 const int N=510,M=510;
6 int a[N],s[N],f[N][M],dis[N][N];
7
8 int mmin(int x,int y) {return x<y?x:y;}
9 int main()
10 {
11 int n,m;
12 scanf("%d%d",&n,&m);
13 s[1]=0;
14 for (int i=2;i<=n;i++)
15 {
16 scanf("%d",&a[i]);
17 s[i]=s[i-1]+a[i];//=1到i的距离
18 }
19 for (int l=1;l<=n;l++)
20 for (int r=l;r<=n;r++)
21 {
22 int mid=(l+r)>>1;
23 dis[l][r]=0;
24 for (int k=l;k<mid;k++)
25 dis[l][r]+=s[mid]-s[k];
26 for (int k=mid+1;k<=r;k++)
27 dis[l][r]+=s[k]-s[mid];
28 }
29 memset(f,63,sizeof(f));
30 f[0][0]=0;
31 for (int i=1;i<=n;i++)
32 for (int j=1;j<=m;j++)
33 {
34 if (j>i) {f[i][j]=0;continue;}
35 for (int k=j-1;k<i;k++)
36 f[i][j]=mmin(f[i][j],f[k][j-1]+dis[k+1][i]);
37 }
38 printf("%d\n",f[n][m]);
39 return 0;
40 }

最新文章

  1. openlayer3 获取feature
  2. shutdown的简单小应用
  3. 仿W8屏保
  4. AWK改变输入输出分隔符实例分析
  5. ASP.NET MVC使用jQuery无刷新上传
  6. Mongoose 是什么?
  7. Docker实例教程[超详细](一)
  8. Helpers\RainCaptcha
  9. dedecms网站如何做在线订单功能
  10. Unity3D 相机跟随主角移动
  11. ocean所用的蝴蝶纹理
  12. java代码实现ftp服务器的文件上传和下载
  13. Spring之对象依赖关系(依赖注入Dependency Injection)
  14. iOS - 抖音效果
  15. vSphere虚拟化管理平台的功能
  16. git 生成秘钥
  17. xml json
  18. 关于STM32 SPI NSS的讨论
  19. [jquery-ajax] jquery ajax 三种情况对比
  20. 使用STL sort对字符串按字典序排序

热门文章

  1. Jenkins Android APP 持续集成体系建设二—自动部署、执行测试任务,关联打包任务
  2. TCP/IP五层模型-传输层-UDP协议
  3. 使用K8s的一些经验和体会
  4. 【Linux】cp命令的各种妙用
  5. 【ORA】ORA-32004: 问题分析和解决
  6. leetcode 886. 可能的二分法(DFS,染色,种类并查集)
  7. oralce move和shrink释放高水位
  8. 微人事项目-mybatis-持久层
  9. 通过js给某个标签添加内容或者删除标签
  10. VGA调试心得