状态转移
d(i,j) 为切割小木棍i~j的最优费用
d(i,j) = min{d(i,k)+d(k+j)|i<k<j}+a[j]-a[i]
#include <bits/stdc++.h>
using namespace std;
const int maxn = 50+5;
int L,n,vis[maxn][maxn],d[maxn][maxn],a[maxn];
int dp(int i,int j){
if(i >= j-1) return 0;
if(vis[i][j]) return d[i][j];
vis[i][j] = 1;
d[i][j] = -1;
for(int k=i+1; k<j; k++){
int v = dp(i,k) + dp(k,j) + a[j] - a[i];
if(d[i][j]<0 || v<d[i][j]) d[i][j] = v;
}
return d[i][j];
}
int main(){
while(cin>>L && L){
cin >> n;
memset(vis,0,sizeof(vis));
for(int i=1; i<=n; i++){
cin >> a[i];
}
a[0] = 0,a[n+1] = L;
cout << "The minimum cutting is " << dp(0,n+1) << "." << endl;
}
}