Photolog
Back to list of problems
Cutting Sticks
10003.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int len, n;
int cuts[60];
int table[60][60];
int
calc(int beg, int end) {
int i;
int min=1000000000;
if (beg+1==end) {
return 0;
}
if (beg+2==end) {
return cuts[end]-cuts[beg];
}
if (table[beg][end]) {
return table[beg][end];
}
for (i=beg+1; i<end; i++) {
int cost = calc(beg,i) + calc(i,end);
if (cost < min) {
min = cost;
}
}
return table[beg][end] = cuts[end]-cuts[beg] + min;
}
int
main(void) {
int i;
while (1) {
scanf("%d", &len);
if (len==0) {
break;
}
if (len<0 || len>=1000) abort();
scanf("%d", &n);
if (n>=50) abort();
cuts[0] = 0;
cuts[n+1] = len;
for (i=1; i<=n; i++) {
scanf("%d", &cuts[i]);
if (cuts[i]<0 || cuts[i]>=len) abort();
}
memset(table, 0, sizeof(table));
printf("The minimum cutting is %d.\n", calc(0, n+1));
}
return 0;
}









