POJ 1160 Post Office(DP)
2013-08-12 23:02
495 查看
题意:有m个村庄排成一条直线,现在需要在这些村庄里建n个邮局,使得各个村庄到最近邮局的总距离和最小。
思路: 用dp[i][j]记录把前i个邮局建到前j个村庄中的最优解。
用cost[i][j]记录所有在i到j村庄中,建1个邮局的最小代价。
让前i个邮局覆盖前j个村庄,第i+1个邮局覆盖第j+1至j+k个村庄(j+k<=n),则状态转移方程为
dp[i+1][j+k]=min{dp[i][j]+cost[j+1][j+k];} (k+j<=n)
思路: 用dp[i][j]记录把前i个邮局建到前j个村庄中的最优解。
用cost[i][j]记录所有在i到j村庄中,建1个邮局的最小代价。
让前i个邮局覆盖前j个村庄,第i+1个邮局覆盖第j+1至j+k个村庄(j+k<=n),则状态转移方程为
dp[i+1][j+k]=min{dp[i][j]+cost[j+1][j+k];} (k+j<=n)
#include<stdio.h> #define maxn 2000000 int m,n;//m个村庄,n个邮局 int v[1000],dp[1000][1000],cost[1000][1000];//dp[i][j]记录把前i个邮局建到前j个村庄中的最优解 void pre()//提前预处理出第i个到第j村庄建一个邮局所需要的花费 { int i,j,k,mid; for(i=1;i<=m;i++) for(j=i;j<=m;j++) { cost[i][j]=0; mid=(i+j)/2; for(k=i;k<=mid;k++) cost[i][j]+=v[mid]-v[k]; for(k=mid+1;k<=j;k++) cost[i][j]+=v[k]-v[mid]; } } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int i,j,k; scanf("%d%d",&m,&n); for(i=1;i<=m;i++) scanf("%d",&v[i]);//输入各个村庄的坐标 pre(); for(i=0;i<=n;i++) for(j=0;j<=m;j++) dp[i][j]=maxn; dp[0][0]=0; for(i=0;i<=n;i++) for(j=0;j<=m;j++) if(dp[i][j]<maxn) for(k=1;j+k<=m;k++)//让前i个邮局覆盖前k个村庄,第i+1个邮局覆盖第j+1到第j+k个村庄。 if(dp[i+1][j+k]>dp[i][j]+cost[j+1][j+k]) dp[i+1][j+k]=dp[i][j]+cost[j+1][j+k]; printf("%d\n",dp [m]); }
相关文章推荐
- 【POJ1160】Post Office(动态规划 DP)
- POJ 1160 Post Office (四边形不等式优化DP)
- POJ1160 Post Office(经典DP)
- POJ 1160 Post Office(dp)
- POJ 1160 Post Office(抽象的二维DP)
- POJ-1160 Post office 四边形优化DP
- poj 1160 Post Office(DP简单题)
- DP 【POJ1160】POST OFFICE 邮局问题
- poj 1160 Post Office (间隔DP)
- 【DP】 POJ 1160 Post Office
- poj 1160 Post Office & SCAU 07校赛10320 Post Office ( dp )
- poj 1160 Post Office(四边形不等式优化dp)
- Poj-1160 Post Office(经典dp
- POJ 1160 Post Office(DP)
- dp四边形优化 poj 1160 Post Office题解
- [DP优化] POJ 1160 Post Office
- poj 1160 Post Office(经典dp)
- poj-1160 post office (dp)
- POJ 1160 Post Office(经典DP)
- poj 1160 post office------DP