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

代码君

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

时间: 2024-12-18 20:08:32

UVa 10003 (可用四边形不等式优化) Cutting Sticks的相关文章

区间dp+四边形不等式优化

区间dp+四边形优化 luogu:p2858 题意 给出一列数 \(v_i\),每天只能取两端的数,第 j 天取数价值为\(v_i \times j\),最大价值?? 转移方程 dp[i][j] :n天卖掉i..j货物的收益 dp[begin][end]=max(dp[begin][end-1]+value[end]*(n-len+1) ,dp[begin+1][end]+value[begin]*(n-len+1)); 注意理解 代码 递推形式 #include<bits/stdc++.h>

四边形不等式优化

四边形不等式优化条件(转自这里) 在动态规划中,经常遇到形如下式的转台转移方程: m(i,j)=min{m(i,k-1),m(k,j)}+w(i,j)(i≤k≤j)(min也可以改为max) 上述的m(i,j)表示区间[i,j]上的某个最优值.w(i,j)表示在转移时需要额外付出的代价.该方程的时间复杂度为O(N^3). 下面我们通过四边形不等式来优化上述方程,首先介绍什么是"区间包含的单调性"和"四边形不等式" (1)区间包含的单调性:如果对于i≤i'<j≤

四边形不等式优化DP——石子合并问题 学习笔记

好方啊马上就要区域赛了连DP都不会QAQ 毛子青<动态规划算法的优化技巧>论文里面提到了一类问题:石子合并. n堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分. 求出将n堆石子合并成一堆的最小得分和最大得分以及相应的合并方案. 设m[i,j]表示合并d[i..j]所得到的最小得分. 状态转移方程: 总的时间复杂度为O(n3). [优化方案] 四边形不等式: m[i,j]满足四边形不等式 令s[i,j]=max{k | m[

HDU 2829 Lawrence (斜率优化DP或四边形不等式优化DP)

题意:给定 n 个数,要你将其分成m + 1组,要求每组数必须是连续的而且要求得到的价值最小.一组数的价值定义为该组内任意两个数乘积之和,如果某组中仅有一个数,那么该组数的价值为0. 析:DP状态方程很容易想出来,dp[i][j] 表示前 j 个数分成 i 组.但是复杂度是三次方的,肯定会超时,就要对其进行优化. 有两种方式,一种是斜率对其进行优化,是一个很简单的斜率优化 dp[i][j] = min{dp[i-1][k] - w[k] + sum[k]*sum[k] - sum[k]*sum[

hdu 3480 dp 四边形不等式优化

http://acm.hdu.edu.cn/showproblem.php?pid=3480 给出一个数字集合 S,大小为 n,要求把这个集合分成m个子集,每分出一个子集的费用是子集中的 (max-min)^2,求最小费用. 开始的dp转移很容易想到. 首先对集合从小到大排序,dp[i][j] 表示前i个元素被分成j个子集的最小费用.然后枚举最后一个子集. dp[i][j] = min{dp[k-1][j-1] + cost(k, i)}; 这个转移明显是过不去的,n<10000 m<5000

石子合并(四边形不等式优化dp)

该来的总是要来的———————— 经典问题,石子合并. 对于 f[i][j]= min{f[i][k]+f[k+1][j]+w[i][j]} From 黑书 凸四边形不等式:w[a][c]+w[b][d]<=w[b][c]+w[a][d](a<b<c<d) 区间包含关系单调: w[b][c]<=w[a][d](a<b<c<d) 定理1:  如果w同时满足四边形不等式和决策单调性 ,则f也满足四边形不等式 定理2:  若f满足四边形不等式,则决策s满足 s[i

[dp专题-四边形不等式优化]51nod 1022

? 1021?石子归并?V1 N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的代价.计算将N堆石子合并成一堆的最小代价. ? 例如: 1 2 3 4,有不少合并方法 1 2 3 4 => 3 3 4(3) => 6 4(9) => 10(19) 1 2 3 4 => 1 5 4(5) => 1 9(14) => 10(24) 1 2 3 4 => 1 2 7(7) => 3 7(1

pku 1160 Post Office 四边形不等式优化 经典DP

pku 1160 Post Office 四边形不等式优化 经典DP 邮局 经典的动态规划问题,主要体现在状态的设计和可以用四边形不等式优化上 题意是:给你n个村庄,然后让你用m个邮局对这些村庄进行覆盖,然后让你设计覆盖方式使得每个村庄到其对应邮局的路程和最短 本题状态的设计的灵感来源于"覆盖"这个点,最优子结构其实就是用 m 个邮局覆盖,以及用 m-1个邮局覆盖 那么,状态为dp[n][m] 为前 n 个村庄用 m 个邮局进行覆盖使得每个村庄到其对应的邮局的最短路程和 转移方程:dp

动态规划专题小结:四边形不等式优化

今天第一次学习四边形不等式优化dp,感觉优化效果十分给力,不过数学味道比较浓重,证明比较复杂.因此这里删繁就简,给出关于四边形不等式优化必须要明白的地方,以后直接套用条件即可. 四边形不等式优化条件 在动态规划中,经常遇到形如下式的转台转移方程: m(i,j)=min{m(i,k-1),m(k,j)}+w(i,j)(i≤k≤j)(min也可以改为max) 上述的m(i,j)表示区间[i,j]上的某个最优值.w(i,j)表示在转移时需要额外付出的代价.该方程的时间复杂度为O(N^3). 下面我们通