http://poj.org/problem?id=1160
算水过的吧 四重循环没优化 CZ说爆可过 就爆了
dp[i][j] = min(dp[i][j],dp[i-1][g]-s) 第i个点建在第j个村庄上 s 是这个点比上个点少的距离
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<cmath>
using namespace std;
#define N 1010
#define INF 0xfffffff
int h[N],dp[][N];
int main()
{
int i,j,k,n,m,g;
scanf("%d%d",&n,&m);
for(i = ; i <= n; i++)
scanf("%d",&h[i]);
for(i = ; i <= n ; i++)
{
int s = ;
for(j = ; j <= n ; j++)
s+=abs(h[j]-h[i]);
dp[][i] = s;
}
for(i = ; i <= m ; i++)
for(j = i ; j <= n ; j++)
{
dp[i][j] = INF;
for(g = i-; g < j ; g++)
{
int s=,ss=;
for(k = g+ ; k < j; k++)
{
s+=min(h[k]-h[g],h[j]-h[k]);
ss+=(h[k]-h[g]);
}
dp[i][j] = min(dp[i][j],dp[i-][g]-ss-(h[j]-h[g])*(n-j+)+s);
}
}
int minz=INF;
for(i = m; i <= n ; i++)
minz = min(minz,dp[m][i]);
printf("%d\n",minz);
return ;
}