zoukankan      html  css  js  c++  java
  • UVa 10003 (可用四边形不等式优化) Cutting Sticks

    题意:

    有一个长为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)

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

     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
    ", d[0][n]);
    33     }
    34 
    35     return 0;
    36 }
    代码君

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

  • 相关阅读:
    CSS——before和after伪元素
    CSS——滑动门技术及应用
    CSS案例3(在线教育网站)
    CSS——背景渐变
    CSS字体图标
    CSS——精灵技术
    CSS——溢出文字隐藏
    Intellij IDEA -01 如何配置项目!
    Intellij Idea -02 如何将项目工程横向排列变成纵向排列
    java8 --新特性汇总
  • 原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/4006520.html
Copyright © 2011-2022 走看看