poj 1160Post Office
2012-04-15 10:11
369 查看
题意:
给定的一系列的排在整数轴上的村庄位置,然后找出P个村庄建立邮局;
以使每个村庄到他最近的邮局的距离之和最小;
解题思路:
采用动态规划,详见注释
给定的一系列的排在整数轴上的村庄位置,然后找出P个村庄建立邮局;
以使每个村庄到他最近的邮局的距离之和最小;
解题思路:
采用动态规划,详见注释
#include<iostream> using namespace std; int cost[301][301];//从村落i到村落j由一个邮局控制时的最短距离和 int a[31][301];//a[i][j]记录在前j个村庄中安排i个邮局的最短路径 int vel[301];//记录输入村庄的位置信息 int main() { int v,p; int i,j,k; cin>>v>>p; //输入位置信息 for(i=1;i<=v;++i) cin>>vel[i]; memset(cost,0,sizeof(cost)); memset(a,0,sizeof(a)); //从村落i到村落j由一个邮局控制时的最短距离和 for(i=1;i<=v;++i) { for(j=i;j<=v;++j) { int mid=(i+j)/2; for(k=i;k<mid;++k) cost[i][j]+=vel[mid]-vel[k]; for(k=mid+1;k<=j;++k) cost[i][j]+=vel[k]-vel[mid]; //cout<<cost[i][j]<<" "; } //cout<<endl; } //计算在前j个村路中建立1个邮局控制的最短距离之和 for(j=1;j<=v;++j) a[1][j]=cost[1][j]; for(i=2;i<=p;++i) { for(j=i;j<=v;++j) { int minN=0x7fffffff; //在前k个村庄设置i-1个邮局加上在k到j之间的村庄设置一个邮局的最小值计为 //在前j个村庄放置i个邮局的最小距离 for(k=i-1;k<j;++k) { if(a[i-1][k]+cost[k+1][j] < minN) minN=a[i-1][k]+cost[k+1][j]; } a[i][j]=minN; } } cout<<a[p][v]<<endl; return 0; }
相关文章推荐
- POJ-1160 Post Office (DP+四边形不等式优化)
- poj 1160(Post Office)
- 【poj1160】 Post Office
- 【DP】 POJ 1160 Post Office
- POJ - 1160 Post Office(基础dp)
- POJ 1160 Post Office(DP)
- POJ - 1160 Post Office(四边形优化)
- POJ 1160 Post Office (区间DP+重心)
- [IOI2000][POJ1160]Post office
- [dp] poj1160 Post office
- POJ1160--Post Office(四边形不等式优化)
- POJ--1160--Post Office
- POJ 1160 Post Office
- POJ 1160 Post Office
- 【POJ】【1160】Post Office
- POJ 1160 Post Office(经典DP)
- poj1160 [IOI2000] Post Office(区间dp+四边形不等式)
- POJ 1160 Post Office
- POJ 1160 Post Office 四边形不等式优化DP
- POJ 1160 Post Office