试题描述
将一段木棒按要求切割,每次切割都要付出与木棒长度相同的代价,求最小代价切割。
(多组数据)
输入描述
长度L。
切割点数n(n<=50)。
n个切割点。
输出描述
"The minimum cutting is " + ans +"."
输入样例
100
3
25 50 75
10
4
4 5 7 8
0
输出样例
The minimum cutting is 200.
The minimum cutting is 22.
简单DP
f[i][j] = min{f[i][k] + f[k][j] + a[j] - a[i] }
code:
#include <stdio.h> #include <string.h> #define INF 0xfffffff int a[55]; int L, n; int f[55][55]; int main() { int i, j, c, k; int tmp; while(scanf("%d",&L),L) { scanf("%d",&n); for(i=1; i<=n; i++) scanf("%d",&a[i]); a[0] = 0; a[++n] = L; memset(f,0,sizeof(f)); for(c=2; c<=n; c++) for(i=0;i<=n-c; i++) { j = i+c; tmp = INF; for(k=i+1;k<j;k++) if(tmp>f[i][k]+f[k][j]+a[j]-a[i]) tmp = f[i][k]+f[k][j]+a[j]-a[i]; f[i][j] = tmp; } printf("The minimum cutting is %d. ",f[0][n]); } return 0; }