poj1161Post Office【经典dp】
题目:poj1161Post Office id=1160" target="_blank">点击打开链接
题意:给出一条直线上的n个坐标表示村庄的位置,然后要在上面建p个邮局。村民优先选择去近的邮局。问全部村庄去邮局的最小距离和是多少?
分类:区间dp
分析:对于随意一个村庄,仅仅有两种选择,要么在这儿建邮局。要么不建,我们能够预处理出来随意两件建立一个邮局的的最小距离w【i】【j】,而对于随意两点,建立一个邮局的最优方案是建立在两点的中位数上,即(i+j)/2。位置。
对于随意两点 i---j ,建立两个邮局的最优结果我们能够由建立一个的得到。枚举分点,然后从中间分开。前面建一个,后面建一个。
那么我们就能够写出状态及方程
定义状态:dp【i】【j】表示在前 i 个存在建立 j 个邮局的最小距离。
转移方程:dp【i】【j】=min(dp【i】【j】。dp【k】【j-1】+w【k+1】【i】) (j-1<=K<=i-1)
注意:
1:这个题目的dp方向是邮局数目。不是村庄数目,有建立邮局的数目1----p的方向dp
2:注意dp初始化后,其它值一定在循环内部初始化,否则不一定最优、
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <map>
#include <cmath>
using namespace std;
#define Del(a,b) memset(a,b,sizeof(a))
const int N = 500;
int w[N][N];
int dp[N][45];
int dis[N]; int main()
{
//freopen("Input.txt","r",stdin);
int n,k;
while(~scanf("%d%d",&n,&k))
{
for(int i=1;i<=n;i++)
scanf("%d",&dis[i]);
Del(w,0);
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
w[i][j] = w[i][j-1]+ dis[j] - dis[(i+j)/2];
}
//printf("\n");
}
Del(dp,0x3f3f3f3f);
for(int i=1;i<=n;i++)
{
dp[i][1]=w[1][i];
dp[i][i]=0;
}
for(int j=2;j<=k;j++)
{
for(int i=j+1;i<=n;i++)
{
dp[i][j]=0x3f3f3f3f;//注意标准写法
for(int f=j-1;f<=i-1;f++)
dp[i][j]=min(dp[i][j],dp[f][j-1]+w[f+1][i]);
}
}
printf("%d\n",dp[n][k]);
}
return 0;
}
poj1161Post Office【经典dp】的更多相关文章
- POJ 1160:Post Office 邮局经典DP
Post Office Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17168 Accepted: 9270 Desc ...
- HDU 1003 Max Sum --- 经典DP
HDU 1003 相关链接 HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义 ...
- poj1458 求最长公共子序列 经典DP
Common Subsequence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 45763 Accepted: 18 ...
- NYOJ - 矩形嵌套(经典dp)
矩形嵌套时间限制:3000 ms | 内存限制:65535 KB 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b< ...
- 51nod 1412 AVL树的种类(经典dp)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1412 题意: 思路: 经典dp!!!可惜我想不到!! $dp[i][k] ...
- NYOJ 16 矩形嵌套(经典DP)
http://acm.nyist.net/JudgeOnline/problem.php?pid=16 矩形嵌套 时间限制:3000 ms | 内存限制:65535 KB 难度: ...
- poj 1050 To the Max 最大子矩阵和 经典dp
To the Max Description Given a two-dimensional array of positive and negative integers, a sub-rect ...
- CS Academy Distinct Neighbours(经典dp)
CS Academy Distinct Neighbours(经典dp) 题意: 求相邻无相同数字的合法的排列数 题解: 题解 先将相同的数字分为一类,假设共有n组 定义\(dp[i][j]\)表示前 ...
- 【经典dp 技巧】8.13序列
经典的拆绝对值 题目大意 给定$n$个具有顺序的序列,允许对每个序列循环移动.记第$i$个序列尾元素为$x$,$i+1$个序列首元素为$y$,定义其连接收益为$|x-y|*i$,求$n$个序列连接最大 ...
随机推荐
- PHP12 文件操作
学习要点 文件系统概述 目录基本操作 文件基本操作 文件上传下载 文件上传类的设计 文件系统概述 概述 PHP文件系统的操作是基于UNIX系统模型,所以有一些文件处理函数无法在windows服 ...
- PHP10 错误和异常处理
学习要点 修改错误报告级别 写错误日志 异常处理实现 自定义异常 捕获多路异常 错误处理 定义 错误:开发过程中的失误.用户操作引起的错误. 错误产生原因 语法错误:开发环境提示,未修正则脚本无法 ...
- tensorflow-gpu install check
https://gist.github.com/mrry/ee5dbcfdd045fa48a27d56664411d41c#file-tensorflow_self_check-py-L16
- C++ new delete(一)
在C#.Java這種managed語言,因為有garbage collection,所以完全不用考慮free()或delete,但在C/C++,有時候要delete的,有時又不用,到底哪些改delet ...
- maven构建springmvc项目
1.Eclipse中 NEW ->OTHER->Maven->maven project 2.选择项目路径 3.选择项目类型->next->输入groupid和artif ...
- Tomcat server.xml配置文件
server.xml配置文件: <?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to ...
- 牛客网 牛可乐发红包脱单ACM赛 A题 生成树
[题解] 其实就是求两棵树不同的边有多少条.那么我们用一个set来去重即可. #include<cstdio> #include<cstring> #include<se ...
- 【07】Firebug监控网络情况
[07] Firebug监控网络情况 Firebug可以监控网页中每个文件加载的时间. 打开Firebug.点击"网络",然后确定已经启用,重新载入当前页面.Firebug显示如下 ...
- luogu3960 列队
参考这篇 #include <iostream> #include <cstdio> #include <vector> using namespace std; ...
- Struts2的Action配置的各项默认值
1 如果没有为action指定class,默认是ActionSupport 2 如果没有为action指定method,默认执行action中的execute()方法 3 如果没有指定result的n ...