#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<memory.h>
#include<queue>
#include<stack>
using namespace std;
const int V_MAX = 305;
const int P_MAX = 35;
const int INF = 1<<30;
//村庄数
int vNum;
//邮局数
int pNum;
//村庄坐标
int vPos[V_MAX];
//d[i][j]表示在村庄i和村庄j之间建1个Post office的最小距离和
int d[V_MAX][V_MAX];
//dp[i][j]表示在村庄1和村庄i之间建j个Post office的最小距离和
int dp[V_MAX][P_MAX];
void Solve()
{
int i, j, k;
//利用DP,计算d[i][j]的值
for(i=1;i<=vNum;i++)
{
for(j=i+1;j<=vNum; j++)
{
d[i][j]=d[i][j-1]+(vPos[j]-vPos[(i + j )/2] );
}
}
for( i=1;i<=vNum; i++ )
{
dp[i][0] = INF;
}
//利用DP,计算dp[i][j]的值
for(i=1;i<=vNum;i++)
{
for(j=1; j<=pNum && j<=i; j++ )
{
int min = INF;
for( k=j-1; k<i; k++ )
{
if( dp[k][j-1] + d[k+1][i] < min )
min = dp[k][j-1] + d[k+1][i];
}
dp[i][j] = min;
}
}
cout << dp[vNum][pNum] << endl;
}
int main()
{
while(cin >> vNum >> pNum)
{
for( int i=1; i<=vNum; i++ )
{
cin >> vPos[i];
}
Solve();
}
return 0;
}
POJ1160 Post Office
最新推荐文章于 2022-01-19 11:05:56 发布