您的位置:首页 > 其它

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个切割点所需的最小花费。

#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了,还纳闷为什么会超时呢...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: