码迷,mamicode.com
首页 > 其他好文 > 详细

UVa 10003 (可用四边形不等式优化) Cutting Sticks

时间:2014-10-05 01:50:27      阅读:380      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   ar   for   sp   

题意:

有一个长为L的木棍,木棍中间有n个切点。每次切割的费用为当前木棍的长度。求切割木棍的最小费用。

分析:

d(i, j)表示切割第i个切点到第j个切点这段所需的最小费用。则有d(i, j) = min{d(i, k) + d(k, j)} + a[j] - a[i]; ( i < k < j ) 最后一项是第一刀的费用。

时间复杂度为O(n3)

最后还要注意一下输出格式中整数后面还要加一个句点。

 

bubuko.com,布布扣
 1 //#define LOCAL
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring> 
 5 using namespace std;
 6 
 7 const int INF = 1000000000;
 8 const int maxn = 60;
 9 int a[maxn], L, n, d[maxn][maxn];
10 
11 int main(void)
12 {
13     #ifdef LOCAL
14         freopen("10003in.txt", "r", stdin);
15     #endif
16 
17     while(scanf("%d", &L) == 1 && L)
18     {
19         scanf("%d", &n);
20         for(int i = 1; i <= n; ++i)    scanf("%d", &a[i]);
21         a[0] = 0, a[++n] = L;
22         //for(int i = 0; i < n; ++i)    d[i][i+1] = a[i+1] - a[i];
23 
24         for(int l = 2; l <= n; ++l)
25             for(int i = 0; i + l <= n; ++i)
26             {
27                 d[i][i+l] = INF;
28                 for(int k = i + 1; k < i + l; ++k)
29                     d[i][i+l] = min(d[i][k] + d[k][i+l] + a[i+l] - a[i], d[i][i+l]);
30             }
31         
32         printf("The minimum cutting is %d\n", d[0][n]);
33     }
34 
35     return 0;
36 }
代码君

 

 

可以用四边形不等式来优化到O(n2),待续……

 

UVa 10003 (可用四边形不等式优化) Cutting Sticks

标签:style   blog   http   color   io   os   ar   for   sp   

原文地址:http://www.cnblogs.com/AOQNRMGYXLMV/p/4006520.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!