UVa 10003 - Cutting Sticks
2013-09-07 15:40
309 查看
题目大意:有一根长l的木棍,有n个切割点要把这根木棍切成n+1段,知道n个切割点的位置。切割一段长度为d的木棍需要的花费为d,如一段长度为10的木棍,有3个切割点:2,5,7,如果按切割点位置从左到右进行切割,所需花费为10+8+5。找出合理的切割顺序使得花费最小。
想到了最优矩阵链乘...dp,使用自顶向下带备忘的dp方法,cost[left][right]记录切割从第left个切割点到第right个切割点所需的最小花费。
View Code
开始在cut函数内忘记给cost[][]保存值了,结果TLE了,还纳闷为什么会超时呢...
想到了最优矩阵链乘...dp,使用自顶向下带备忘的dp方法,cost[left][right]记录切割从第left个切割点到第right个切割点所需的最小花费。
#include <cstdio> #include <cstring> #include <climits> #include <algorithm> using namespace std; int cost[55][55], a[55]; int cut(int left, int right) { if (cost[left][right] >= 0) return cost[left][right]; if (left + 1 == right) return 0; int lmin = INT_MAX; for (int i = left+1; i < right; i++) lmin = min(lmin, cut(left, i)+cut(i, right)+a[right]-a[left]); return cost[left][right] = lmin; } int main() { #ifdef LOCAL freopen("in", "r", stdin); #endif int l; while (scanf("%d", &l) && l) { int n; scanf("%d", &n); a[0] = 0; for (int i = 1; i <= n; i++) scanf("%d", &a[i]); a[n+1] = l; memset(cost, -1, sizeof(cost)); int ans = cut(0, n+1); printf("The minimum cutting is %d.\n", ans); } return 0; }
View Code
开始在cut函数内忘记给cost[][]保存值了,结果TLE了,还纳闷为什么会超时呢...
相关文章推荐
- [动态规划]UVA10003 - Cutting Sticks
- 【DP】UVA 10003 Cutting Sticks 类似矩阵链乘
- 【解题报告】uva10003_Cutting Sticks(切割木棍, dp)
- uva 10003 Cutting Sticks
- 【UVa 10003】【区间DP】Cutting Sticks【有一个长为L的木棍,木棍中间有n个切点。每次切割的费用为当前木棍的长度。求切割木棍的最小费用。】
- UVa 10003 - Cutting Sticks(区间DP+记忆化)
- uva 10003 Cutting Sticks
- [UVA 10003]Cutting Sticks[DP]
- UVa 10003 Cutting Sticks
- UVa 10003 - Cutting Sticks
- uva 10003 Cutting Sticks(区间DP)
- UVA-10003 Cutting Sticks
- UVA 10003 - Cutting Sticks【DP】
- uva 10003 - Cutting Sticks(区间DP)
- UVA 10003 Cutting Sticks
- uva 10003 Cutting Sticks
- uva 10003 Cutting Sticks
- uva 10003 Cutting Sticks (DP)
- Uva 10003 Cutting Sticks (区间dp)
- UVA 10003 Cutting Sticks(区间dp)