poj1160Post Office
来源:互联网 发布:ubuntu ssd 优化 编辑:程序博客网 时间:2024/06/01 17:52
链接:http://poj.org/problem?id=1160
题意:有n个村庄在一条直线上,能建k个邮局,求所有村庄到离它最近的邮局的总和最小。
分析:四边形不等式优化dp的第一题。赵爽的动态规划加速原理之四边形不等式不错。对于这题我们设dp[i][j]表示前i个村庄建j个邮局的总和最小为多少,w[i][j]表示在第i个村庄到第j个村庄中建一个邮局并且i~j都去这个邮局的最小距离,那么w[i][j]=w[i][j-1]+a[j]-a[(i+j)/2]。w的区间包含单调性和四边形不等式性质都可以很简单地从它的递推是和实际意义证得。
代码:
#include<map>#include<set>#include<cmath>#include<queue>#include<bitset>#include<math.h>#include<vector>#include<string>#include<sstream>#include<stdio.h>#include<cstring>#include<iostream>#include<algorithm>#pragma comment(linker, "/STACK:102400000,102400000")using namespace std;const int N=305;const int MAX=1000000100;const int mod=100000000;const int MOD1=1000000007;const int MOD2=1000000009;const double EPS=0.00000001;typedef long long ll;const ll MOD=998244353;const int INF=0x7fffffff;const double pi=acos(-1.0);typedef double db;typedef unsigned long long ull;int a[N],w[N][N],s[N][40],dp[N][40];int main(){ int i,j,h,n,k; while (scanf("%d%d", &n, &k)!=EOF) { for (i=1;i<=n;i++) scanf("%d", &a[i]); for (i=1;i<=n;i++) for (j=i;j<=n;j++) w[i][j]=w[i][j-1]+a[j]-a[(i+j)/2]; memset(dp,0x3f,sizeof(dp)); for (i=1;i<=n;i++) dp[i][1]=w[1][i],s[i][1]=0; for (i=2;i<=k;i++) { s[n+1][i]=n; for (j=n;j>i;j--) for (h=s[j][i-1];h<=s[j+1][i];h++) if (dp[h][i-1]+w[h+1][j]<=dp[j][i]) { dp[j][i]=dp[h][i-1]+w[h+1][j];s[j][i]=h; } } printf("%d\n", dp[n][k]); } return 0;}
0 0
- poj1160Post Office
- POJ1160Post Office动态规划DP
- poj1160post office{动态规划…
- office
- office
- office
- Office
- office
- office
- office
- Office
- office
- office
- Office |Office常用设置
- 透析Office
- office Automation
- office编程
- office automation
- 安卓侧滑菜单
- S5PV210 FIMC驱动和v4l2驱动框架学习
- Android对话框 Dialog
- Android 代码中setTextColor
- c++内存
- poj1160Post Office
- Linux下查看磁盘分区命令详解
- socket编程_tcp协议_客户端
- Codeforces 696B. Puzzles (概率DP求期望)
- openjdk 与 jdk 区别
- 用php遍历目录下的文件
- CF-697BBarnicle与691CExponential notation
- scala学习笔记二
- start—py(1、函数)