这道题就是个水题,经典动态规划: 石子合并
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=210;
const int inf=0x3fffffff;
typedef long long ll;
ll dp[40][maxn],w[maxn][maxn],d[maxn];
int main(int argc, char *argv[])
{
int n,k,ca=1;
while(scanf("%d%d",&n,&k)==2)
{
if(n==0&&k==0) break;
for(int i=1;i<=n;i++) scanf("%lld",&d[i]);
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
{
w[i][j]=0;
int mid=(i+j)/2;
for(int r=i;r<=j;r++) w[i][j]+=abs(d[mid]-d[r]);
}
for(int i=1;i<=n;i++) dp[0][i]=inf;
dp[0][0]=0;
for(int i=1;i<=k;i++)
for(int j=1;j<=n;j++)
{
dp[i][j]=inf;
for(int r=1;r<=j;r++)
dp[i][j]=min(dp[i][j],dp[i-1][r-1]+w[r][j]);
}
printf("Chain %d\nTotal distance sum = %lld\n\n",ca++,dp[k][n]);
}
return 0;
}