简单DP题。dp(i,j)是i~j这个区间内的最优解,假设下一次在k处分割,dp(i,j)=min(dp(i,k)+dp(k,j))+len(i,j)。
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <memory.h>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <ctype.h>
#define INF 1000000
#define ll long long
#define min3(a,b,c) min(a,min(b,c))
using namespace std;
int a[1010];
int dp[1010][1010];
int main(){
int l;
while(cin>>l){
if(!l)break;
memset(dp,0,sizeof(dp));
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
a[0]=0;a[n+1]=l;
for(int i=2;i<=n+1;i++){
for(int j=0;j+i<=n+1;j++){
dp[j][i+j]=dp[j][j+1]+dp[j+1][i+j]+a[i+j]-a[j];
for(int k=j+1;k<i+j;k++){
dp[j][i+j]=min(dp[j][i+j],dp[j][k]+dp[k][i+j]+a[i+j]-a[j]);
}
}
}
printf("The minimum cutting is %d.\n",dp[0][n+1]);
}
return 0;
}