典型的区间型DP
#include <iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<sstream>
using namespace std;
#define maxn 50+10
int len,n;
int loc[maxn];
int d[maxn][maxn];
string s="";
int fun(int i,int j)
{
if(j-i==1)
return 0;
if(d[i][j]!=-1)
return d[i][j];
int plus=loc[j]-loc[i];
int m=100000000;
for(int k=i+1;k<j;k++)
{
int tmp=fun(i,k)+fun(k,j);
if(tmp<m)
m=tmp;
}
d[i][j]=m+plus;
return d[i][j];
}
int main(int argc, char** argv) {
scanf("%d",&len);
while(len!=0)
{
scanf("%d\n",&n);
for(int i=1;i<=n;i++)
scanf("%d",&loc[i]);
loc[n+1]=len;
for(int i=0;i<=n+1;i++)
for(int j=0;j<=n+1;j++)
d[i][j]=-1;
//printf("%d\n",fun(0,n+1));
ostringstream oss;
oss<<"The minimum cutting is "<<fun(0,n+1)<<".\n";
s+=oss.str();
scanf("%d",&len);
}
cout<<s;
return 0;
}