POJ-1160 Post Office(dp+四边形不等式)
2017-03-01 16:59
274 查看
I - Post Office
POJ - 1160 题意:有N个村庄,坐标Xi依次递增,现在将P个邮局分别建在村庄中,要求所有村庄到最近的邮局的距离最近,问距离之和为多少
题解:
对于区间[i,j],如果要放一个邮局,那么一定是放在最中间是最优的
设dp[i][j]为一共有i个村庄,且已建了j个邮局;w[i][j]表示区间[i,j]内放一个邮局的花费
dp[i][j]=min(dp[k][j-1]+w[k+1][i])
发现w[k+1][i]和dp[i][j]满足四边形不等式,因此可以用四边形不等式定理优化
令s[i][j]表示dp[i][j]的最优决策
由于要用到s[i][j-1]和s[i+1][j]因此i需要逆推
#include<cstdio> #include<algorithm> #include<string.h> using namespace std; const int MX = 305; int w[MX][MX],s[MX][35],dp[MX][35],sum[MX],a[MX]; int main(){ int n,m; while(~scanf("%d%d",&n,&m)){ for(int i=1;i<=n;i++){ scanf("%d",&a[i]); sum[i]=sum[i-1]+a[i]; } for(int i=1;i<=n;i++){ w[i][i]=0; for(int j=i+1;j<=n;j++){ int k=(i+j)>>1; w[i][j]=a[k]*(k-i)-(sum[k-1]-sum[i-1])+(sum[j]-sum[k])-a[k]*(j-k); } } memset(dp,0x3f,sizeof(dp)); for(int i=1;i<=n;i++) { dp[i][1]=w[1][i]; s[i][1]=1; } for(int j=2;j<=m;j++){ s[n+1][j]=n; for(int i=n;i>=j;i--){ //因为后面要用到s[i+1][j],所以要逆序 for(int k=s[i][j-1];k<=s[i+1][j];k++){ if(dp[k][j-1]+w[k+1][i]<dp[i][j]){ dp[i][j]=dp[k][j-1]+w[k+1][i]; s[i][j]=k; } } } } printf("%d\ 4000 n",dp [m]); } return 0; }
相关文章推荐
- 【DP|数学+预处理】POJ-1160 Post Office
- poj1160(Post Office)
- POJ 1160 Post Office
- POJ1160 Post Office (四边形不等式优化DP)
- POJ 1160 Post Office (经典dp)
- poj1160 Post Office
- poj 1160 Post Office & SCAU 07校赛10320 Post Office ( dp )
- poj 1160 post office
- POJ——T 1160 Post Office
- POJ 1160 Post Office(经典DP)
- poj 1160 Post Office (区间DP)
- POJ 1160 Post Office(DP)
- poj 1160 Post Office 四边形优化
- poj 1160 Post Office (四边形不等式优化DP)
- poj 1160Post Office
- POJ 1160 Post Office(DP)
- POJ1160--Post Office(四边形不等式优化)
- POJ--1160--Post Office
- POJ 1160 Post Office
- 【DP】 POJ 1160 Post Office