算法:uva 10003 Cutting Sticks (区间dp)

题目大意

一根长为l的木棍,上面有n个"切点",每个点的位置为c[i]

要按照一定顺 序把每个点都砍段,最后变成了n+1段

每砍一次,就会有一个花费,例如长度为10,“切点”为2,那么砍完 后会变成两段2,8, 那么花费为2+8=10

如果有多个“切点”,那么不同顺序切会得到不同的花费。

最小 花费是多少?

思路

注意要增加一个c[n] = l

f(i, j) 表示(i,j)区间的最小花费

f(i, j) = min{ f(i,k)+f(k+1,j)+c[r]-c[l-1] | l<=k<k }

代码

/**==========================================
* This is a solution for ACM/ICPC problem
*
* @source:uva-10003 Cutting Sticks
* @type: 区间dp
* @author: shuangde
* @blog: blog.csdn.net/shuangde800
* @email: zengshuangde@gmail.com
*===========================================*/

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
#include<cmath>
#include<cstring>
using namespace std;

typedef long long int64;
const int INF = 0x3f3f3f3f;

const int MAXN = 55;
int l, n;
int c[MAXN];
int f[MAXN][MAXN];

int main(){

while (~scanf("%d %d", &l, &n) && l) {
for (int i = 0; i < n; ++i)
scanf("%d", &c[i]);

c[n] = l;
for (int d = 2; d <= n+1; ++d) {
for (int l = 0; l + d -1 <= n; ++l) {
int r = l + d - 1;
int& ans = f[l][r] = INF;
for (int k = l; k < r; ++k) {
ans = min(ans, f[l][k]+f[k+1][r]+c[r]-c[l-1]);
}
}
}

printf("The minimum cutting is %d.\n", f[0][n]);
}
return 0;
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索区间树
, 区间
, 一个
, 不同
, STICKS
最小
区间dp、区间dp入门、区间dp详解、hdu 区间dp、区间dp讲解,以便于您获取更多的相关知识。

时间: 2024-08-25 21:13:41

算法:uva 10003 Cutting Sticks (区间dp)的相关文章

UVa 10003 Cutting Sticks (DP)

10003 - Cutting Sticks Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=114&page=show_problem&problem=944 You have to cut a wood stick into pieces. The most affordable company, The Ana

算法:uva 1351 String Compression(字符串区间dp)

题目大意 给一个字符串,可以把连续相同的部分进行缩写成k(S)的形式,S是一个字符串,k表示 有连续相同的S 例如,abgogogogo,可以缩写成ab4(go). 还可以嵌套缩写,比如 "nowletsgogogoletsgogogo", 缩写成"now2(lets3(go))" 思路 一道区间dp,但是这题并 不好想 f(i, j)表示字符串的i~j位的最小位数 那么 f(i, j) = min{  min{ f(i,k)+f(k+1, j), i<=k&

uva 10688:The Poor Giant(区间dp)

题目链接: uva-10688 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=514&page=show_problem&problem=1629 题意 有n个苹果,和一个数k,第i个苹果的重量是k+i(1<=i<=n). 已知其中只有一个苹果是甜的, 所有比它重量轻的都是苦的,比它重的都是酸的. 为了要找出甜的苹果,就要去一个一个地吃它,且吃了咬了苹果

算法:uva-10304 Optimal Binary Search Tree(区间dp)

题意 给一个序列即可 S = (e1,e2,...,en),且e1<e2<..<en.要把这些序列构成一个二叉搜索 树. 二叉搜索树是具有递归性质的,且若它的左子树不空,则左子树上所有结点的值均小于它的根结点的 值: 若它 的右子树不空,则右子树上所有结点的值均大于它的根结点的值. 因为在实际应用中,被访 问频率越高的元素,就应该越接近根节点,这样才能更加节省查找时间. 每个元素有一个访问频率f(ei) ,当元素位于深度为k的地方,那么花费cost(ei) = k. 所有节点的花费和访问

算法:poj 2378 Tree Cutting(树形dp)

题意 给一颗n个结点的树,节点编号为1~n,把删除一个节点之后, 剩下的分支中节点数量最多的数 量不大于总数量一半的编号全部按顺序输出 思路 和poj-3107 GodFather完全一样,只是输出不一样. 改为<=n/2的就输出即可. 代码 /**===================================================== * This is a solution for ACM/ICPC problem * * @source : poj-2378 Tree C

算法:hdu 4597 Play Game(区间dp)

题意 Alice和Bob玩一个游戏,有两个长度为N的正整数数字序列,每次他们两个 只能从其中一个序 列,选择两端中的一个拿走.他们都希望可以拿到尽量大 的数字之和,并且他们都足够聪明,每次都选择 最优策略.Alice先选择,问 最终Alice拿到的数字总和是多少? 思路 这题应该算是区间dp吧, 可以看一下这题的原型: 其他规则都一样,但是只有一个数字序列,也是每次只能拿左右两端的一个数字 ,问最终Alice拿多少? (这个可以去做uva-10891) 只有一行数字序列可以用f(i, j)表示数

算法题:UVA 348 Optimal Array Multiplication Sequence(区间dp)

Optimal Array Multiplication Sequence Given two arrays A and B, we can determine the array C = A B using the standard definition of matrix multiplication: The number of columns in the A array must be the same as the number of rows in the B array. Not

UVa 348 Optimal Array Multiplication Sequence:区间DP&amp;amp;矩阵链乘,MCM

348 - Optimal Array Multiplication Sequence Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=284 记忆化搜索:dp[a][b] = max(dp[a][b], dp[a][i] + dp[i + 1][b] + x

算法:uva 10859 Placing Lampposts (树形dp)

题目大意 给你一个n个点m条边的无向无环图,在尽量少的节点上放灯,使得所有边都被照亮. 每盏灯将照亮以它为一个端点的所有边. 在灯的总数最小的前提下,被两盏灯同时被照亮的边数应该 尽量大. 思路 这是LRJ<训练指南>上的例题. 这题教会了我一个很有用的技巧:有 两个所求的值要优化,比如让a尽量小,b也尽量小 那么可以转化为让 M*a+b尽量小,其中M应该是 一个比"a的最大值和b的最小值之差"还要大的数 最终的答案为ans/M, ans%M 回到这题,要 求放的灯总数最小