区间DP
对于一个区间如何分割得到最小耗费,是min{该区间各个点进行分割:得到左右区间(子问题)分割最小耗费之和}
#include<bits/stdc++.h>;
using namespace std;
int dp[505][505];
int main()
{
int l,n,a[55];
while(~scanf("%d",&l)&&l)
{
scanf("%d",&n);
//cout<<"n"<<n<<endl;
for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
a[0]=0,a[n+1]=l;
}
memset(dp,-1,sizeof(dp));
for(int i=0;i<=n;i++) {
dp[i][i+1]=0;
}
for(int i=2;i<=n+1;i++)
{
for(int j=0;j<=n+1-i;j++)
{
for(int z=j+1;z<j+i;z++) {
if(dp[j][j+i]==-1||dp[j][z]+dp[z][j+i]+a[j+i]-a[j]<dp[j][j+i])
dp[j][j+i]=dp[j][z]+dp[z][j+i]+a[j+i]-a[j];
}
}
}
cout<<"The minimum cutting is "<<dp[0][n+1]<<'.'<<endl;
}
}