题目大意:给出一个长l的木棍, 再给出n个要求切割的点,每次切割的代价是当前木棍的长度, 现在要求输出最小代价。
解题思路:区间DP, 每次查找当前区间的最优解 , 并记录。需要注意的是输入的切割点并不是从小到大。
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int N = 55; int l, n, val[N], dp[N][N]; int count(int a, int b) { if (dp[a][b]) return dp[a][b]; if (a == b - 1) return 0; dp[a][b] = 1 << 30; for (int i = a + 1; i < b; i++) if (count(a, i) + count(i, b) < dp[a][b]) dp[a][b] = dp[a][i] + dp[i][b]; return dp[a][b] += val[b] - val[a]; } int main() { while (scanf("%d", &l), l) { scanf("%d", &n); memset(val, 0, sizeof(val)); memset(dp, 0, sizeof(dp)); for (int i = 1; i <= n; i++) scanf("%d", &val[i]); sort(val, val + n + 1); val[n + 1] = l; printf("The minimum cutting is %d.\n", count(0, n + 1)); } return 0; }