大致题意:

有v个村庄,每个村庄有各自的位置,且每个位置互不相同。现在要在村庄上设立P个邮局,使每个村庄到最近的邮局的距离之和最小。

分析:

定义状态d[i][j]表示前i个村庄,在这i个村庄中设立j个邮局的最小距离。s[i][j]表示村庄i至村庄j这几个村庄中设立一个邮局的最小距离。如果设立一个邮局,那么邮局设立在(a+b)/2这个位置是最优的。所以可以分解成以下子问题:

d[i][j]的最小值为d[k][j-1]的最小值加上s[k+1][i],s[k+1][i]为在k+1至i这几个村庄中设立一个邮局的最小距离。

d[i][j]=min(d[i][j], d[k][j-1]+s[k+1][i])

边界条件d[i][1]=s[1][i].

s数组可做如下优化:

s[1][4],把邮局设立在2和设立在3上距离是相同的。x2-x1+x3-x2+x4-x2与x3-x1+x3-x2+x4-x3相等。s[1][5]是把邮局设立在3上,s[1][5]=s[1][4]+x[5]-x[3]。由此,可得出递推式:s[i][j]=s[i][j-1]+x[j]-x[(i+j)/2].

#include <iostream>
#include <cstdio>
using namespace std; const int INF=1e8;
int x[305];
int d[305][35];
int s[305][305]; int main()
{
//freopen("in.txt","r",stdin);
int n,p;
while(~scanf("%d%d",&n,&p))
{
for(int i=1;i<=n;i++)
scanf("%d",&x[i]);
for(int i=1;i<=n;i++)
for(int j=1;j<i && j<=p;j++)
d[i][j]=INF;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
s[i][j]=s[i][j-1]+x[j]-x[(i+j)/2];
d[i][1]=s[1][i];
}
for(int i=2;i<=n;i++)
for(int j=2;j<=i && j<=p;j++)
for(int k=j-1;k<i;k++)
d[i][j]=min(d[i][j],d[k][j-1]+s[k+1][i]);
printf("%d\n",d[n][p]);
}
return 0;
}

最新文章

  1. PHP通过ini_set()来设置显示错误信息和执行时间
  2. Java—事件和多线程机制
  3. SQL Server 分页
  4. GridView数据格式化
  5. 正则表达式2&mdash;&mdash;grep命令
  6. apache2反向代理node.js应用
  7. Android之TelephonyManager类的使用案例
  8. c++ RTTI(runtime type info)
  9. cpu亲和力总结taskset和setcpu及其他相关
  10. C语言字符转换ASCII码
  11. Ext JS学习第十三天 Ext基础之 Ext.Element
  12. js在以div添加滚动条
  13. Project Euler:Product-sum numbers (problem 88) C++
  14. Apache Spark 2.2.0 中文文档 - 集群模式概述 | ApacheCN
  15. 代码托管工具 git
  16. ssh 无秘钥登录
  17. node 模块化思想中index.js的重要性
  18. nginx入门示例(二)
  19. Java POI 3.17写入、导入EXCEL性能测试
  20. RHEL7 光盘修复

热门文章

  1. 微信收藏了很多语音,有一些比较有意义的,但是发现只能收藏在微信,没有办法导出了,请大神看清楚,是微信【收藏】的语音,ios或者安卓的方法都可以
  2. elk搜集日志,实现logstash根据message中结构不同动态创建索引并扩展功能,区分message中json和非json数据简单方式
  3. Navigation DialogFragment展示dialog
  4. node.js学习(4)事件
  5. Go语言流程控制02--选择结构之switch
  6. 摄像头定位:ICCV2019论文解析
  7. 深度树匹配模型(TDM)
  8. 编写HSA内核
  9. 新特性,推荐一款超强接口管理神器 Apifox
  10. mybatis入门案例——IDEA版