有一根长度为L的棍子,还有n个切割点的位置,求在切割点处将棍子切割成n+1部分的最小总切割费用,每次切割费用等于被切割木棍长度。
#include<bits/stdc++.h>
using namespace std;
const int INF = 10000;
int a[55], dp[1003][1003], n, l;
int d(int i, int j)
{
if (i >= j-1)
return 0;
if (dp[i][j])
return dp[i][j];
dp[i][j] = INF;
for (int k = i+1; k <= j-1; k++) {
int v = d(i, k) + d(k, j) + a[j] - a[i];
if (v < dp[i][j])
dp[i][j] = v;
}
return dp[i][j];
}
int main()
{
while (cin >> l && l) {
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
a[0] = 0;
a[n+1] = l;
memset(dp, 0, sizeof(dp));
printf("The minimum cutting is %d.\n", d(0, n+1));
}
return 0;
}
用递归更好理解,k为切割点,a[j]-a[i]表示第一刀费用,d(0,n+1)为答案