//11084954 c00h00g 1160 Accepted 784K 47MS G++ 1100B 2012-12-06 22:48:58
//dp[i][j]表示前i个村庄创建了j个邮局
//dp[i][j]=min(dp[k][j-1]+cost[k+1][i]) 1<=k<=i-1 感觉这一题和龟兔赛跑那个题目有点相似
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
//v表示village,p表示post
int v,p;
int dp[305][35];
int cost[305][305];
int pos[305];
int main(){
while(scanf("%d%d",&v,&p)!=EOF){
for(int i=1;i<=v;i++)
scanf("%d",&pos[i]);
for(int i=1;i<=v;i++)
for(int j=i;j<=v;j++){
int mid=(i+j)/2;
int sum=0;
for(int k=i;k<mid;k++)
sum+=pos[mid]-pos[k];
for(int k=mid+1;k<=j;k++)
sum+=pos[k]-pos[mid];
cost[i][j]=sum;
}
memset(dp,0,sizeof(dp));
for(int i=2;i<=v;i++){
dp[i][1]=cost[1][i];
for(int j=2;j<=(i<p?i:p);j++){
dp[i][j]=999999999;
for(int k=1;k<=i-1;k++){
int tmp=dp[k][j-1]+cost[k+1][i];
if(dp[i][j]>tmp)
dp[i][j]=tmp;
}
}
}
printf("%d\n",dp[v][p]);
}
return 0;
}
POJ 1160 dp
最新推荐文章于 2017-05-19 10:42:55 发布