DP POJ1160
来源:互联网 发布:易观大数据峰会 编辑:程序博客网 时间:2024/06/05 07:45
题意:
题目链接
有一排村庄,坐标表示村庄的位置。如(1、4、6、10)表示:在这几个点有村庄。现在要在这一排村庄中建立邮局,使得其它村庄到他们最近邮局的距离总和最小。
其中邮局有V个(V<=300),邮局有P个(P<=30)。问怎么设置邮局位置,求出最小距离。
解法:
1.表示方法
- dp[
i ][j ] : 表示前i 个村庄 建j 个邮局时距离最小值。 - sum
[i][j] : 表示第i 个村庄到第j 个村庄建一个邮局的最小距离。
2. 递推公式的由来
这个题目有点类似于矩阵连乘问题。要求
dp[i][j]=min(dp[i][j],dp[k][j−1]+sum[k+1][i]) ;
3.sum[i][j] 的递推
在
- 如果村庄有奇数个,比如有三个村庄:
x1,x2,x3 ,x1到x2的距离为s1,x2到x3的距离为s2 , 显然建在x2 时距离最小为:s1+s2 。(可以自己造几个case看看). 如果村庄个数为偶数个,那么建在中间两个位置的距离是一样的。比如:
x1,x2,x3,x4 ,x1到x2的距离为s1,x2到x3的距离为s2,x3到x4的距离为s3 ,那么建在中间两个村庄的距离是一样的。建在x2 :s1+2∗s2+s3 ,
建在x3 :s1+2∗s2+s3 。 建在x1 :3∗s1+2∗s2+s3 。因此:在
i 到j 之间建一个邮局的最小距离等于在i 到j−1 之间建一个邮局的距离最小值加上j 点到中位数村庄的距离。即:sum[i][j]=sum[i][j]+x[j]−x[(i+j)/2]
代码:
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>using namespace std;int dp[300+1][300+1],sum[300+1][300+1];int s[300+1];int INF = 100000000;int main(){ int V,P; scanf("%d%d",&V,&P); memset(dp,sizeof(dp),0); memset(sum,sizeof(sum),0); memset(s, sizeof(s), 0); for(int i = 1; i<=V; i++) scanf("%d",&s[i]); for(int i = 1; i<V; i++){ for(int j = i+1; j<=V; j++) sum[i][j] = sum[i][j-1] + s[j] - s[(i+j)/2]; } for(int i = 1; i<=V; i++) dp[i][1] = sum[1][i]; for(int j = 2; j<=P; j++){ for(int i = 1; i<=V; i++){ dp[i][j] = INF; for(int k = 1; k<=i; k++) dp[i][j] = min(dp[i][j] ,dp[k][j-1]+sum[k+1][i]); } } printf("%d\n",dp[V][P]); return 0;}
0 0
- POJ1160 dp
- DP POJ1160
- poj1160 区间DP
- POJ1160-典型DP
- POJ1160-典型DP
- poj1160(区间DP)
- [dp] poj1160 Post office
- poj1160
- POJ1160
- POJ1160
- 【POJ1160】Post Office(动态规划 DP)
- poj1160——Post Office//dp
- poj1160 Post Office 四边形优化dp
- DP 【POJ1160】POST OFFICE 邮局问题
- POJ1160 Post Office(经典DP)
- 【POJ1160】【IOI2000】邮局(区间dp)
- 【POJ1160】【四边形优化DP】Post Office
- [wqs二分 DP] POJ1160. Post Office
- DRP视频总结
- 打印问题
- 面试题6:重建二叉树
- SDWebImage使用详解
- Java Servlet Example
- DP POJ1160
- JQuery与Ajax的结合进行文本框内容验证
- iOS 微信第三方登录
- XML(2)——结识DTD
- poj3311 TSP问题 状压DP
- Linux内核module_param的使用
- vc++ DLL开发小结
- Uva-548-Tree(二叉树与stream与dfs)
- 堆排序