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$个序列连接最大 ...
随机推荐
- SQL Sever中多列拼接成一列值为NULL
查询出数据 SELECT a.ID AS KYMain_ID , ',' + a.Leader + ',' AS KYMain_Leader , ), b.TaskLeader) FROM TB_KY ...
- Centos7 安装 MySQL8以及远程访问的配置
Centos7 安装MySQL8 1. 添加MySQL8的本地源 执行以下命令获取安装MySQL源 [root@virde ~]# wget https://repo.mysql.com//mysql ...
- (16) Cloudflare pki公钥基础设施
该工具组共有8个工具 1.cfssl 常用的可用指令: sign signs a certificate bundle build a certificate bundle genkey genera ...
- linux秘钥分发
秘钥分发 ssh-copy-id -i /root/.ssh/id_rsa.pub "-p 9000 root@192.168.1.100" 传送文件 scp -P9000 -rp ...
- 条款36:绝不重新定义继承而来的non-virtual函数(Never redefine an inherited non-virtual function)
NOTE: 1.绝对不要重新定义继承而来的non-virtual函数.
- perl学习之:package and module
perl的包(package)和模块(PM) ==================================包package=========================== pac ...
- LeetCode(169)Majority Element
题目 Given an array of size n, find the majority element. The majority element is the element that app ...
- oracle备份表和数据
oracle 备份数据 如果备份表存在 原表t_base_employee,备份表t_base_employee20180718 insert into t_base_employee0718 sel ...
- Leetcode 319.灯泡开关
灯泡开关 初始时有 n 个灯泡关闭.第 1 轮,你打开所有的灯泡.第 2 轮,每两个灯泡你关闭一次.第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭).第 i 轮,每 i 个灯泡切换 ...
- [luoguP2704] 炮兵阵地(状压DP)
传送门 可以事先把每一行的所有状态处理出来,发现每一行的状态数最多不超过60个 f[i][j][k]表示前i行,第i行为状态j,第i-1行为状态k的最优解 #include <vector> ...