POJ1160

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
#include<vector>
#define maxn 305
#define rint register int
#define ll long long
#define int unsigned long long
#define inf 0x77777777777777f
#define pb push_back
#define mod (int)1e9 + 7
using namespace std;
inline int read()
{
    char c=getchar();int x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}
inline void write(int x)
{
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
    return ;
}

int v, p, a[maxn], dis[maxn][maxn], f[maxn][maxn];
//dis[i][j]表示i到j建一个邮局最小距离,f[i][j]表示1到i建j个最小距离和 

signed main()
{
    v = read(), p = read();
    for (rint i = 1; i <= v; ++i) a[i] = read();
    for (rint i = 1; i <= v; ++i)
      for (rint j = i; j <= v + 1; ++j)
        dis[i][j] = dis[i][j - 1] + a[j] - a[(i + j) / 2];
    memset(f, 0x3f, sizeof(f));
    for (rint i = 1; i <= v; ++i) f[i][1] = dis[1][i];
    for (rint j = 1; j <= p; ++j)
      for (rint i = j; i <= v; ++i)
        for (rint k = j - 1; k <= i - 1; ++k)
          f[i][j] = min(f[i][j], f[k][j - 1] + dis[k + 1][i]);
    write(f[v][p]);
    return 0;
} 
View Code

 

posted @ 2019-09-20 19:16  MXR_alone  阅读(140)  评论(0编辑  收藏  举报