UVa 307 - Sticks】的更多相关文章

Sticks  [题目链接]:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=243 [ 随 笔 ]:很久之前就遇到这道题,题目意思容易理解,后来自己想到了一个法子,思路也很清晰就将代码敲出来了,用了位运算(后来问师兄是说状态压缩,其实我不知道什么是状态压缩~_~),不过提交的时候超时了,我想着优化代码,尽可能…
中文题 (一般都比较坑) 思路:DFS (感谢学长的幻灯片) 这破题把我折腾惨了!!!搞了n天 // by Sirius_Ren #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n,a[100],sum,jy,maxx,q; bool vis[100]; bool cmp(int a,int b){return a>b;} bool dfs(int…
Sticks(UVA - 307) 题目链接 算法 DFS+剪枝 1.这道题题意就是说原本有一些等长的木棍,后来把它们切割,切割成一个个最长为50单位长度的小木棍,现在想让你把它们组合成一个个等长的大木棍,要求这个拼接成的大木棍的长度最小.问最小长度是多少.(注意,在接下来的介绍中,将最后的大木棍表述为拼接木棍,小木棍还是叫小木棍) 2.看完这个题,基本思路是从一个小木棍开始找,找到一个未使用的小木棍后拼接,当拼接成的长度是所有小木棍长度和的约数时,就暂时把它定义为拼接木棍的最小长度,然后计算最…
[Link]: [Description] 给你最多n个棍子; (n< = 64) 每根棍子长度(1..50) 问你这n根棍子,可以是由多少根长度为x的棍子分割出来的; x要求最小 [Solution] 首先,将各根棍子的长度求和->sum 最后的长度x肯定是sum的因子; 则枚举x从各根棍子长度的最大值到sum作为因子; 枚举量假设为len; 然后一直用剩余的棍子去凑这个长度len 凑够了,就重新选择剩下的棍子,继续凑len; 剪枝: 1.还需要凑的量为len,但是尝试用完某根棍子之后,无法…
排序之后再剪枝,有点神 #include <cstdio> #include <cstdlib> #include <cmath> #include <map> #include <set> #include <sstream> #include <string> #include <cstring> #include <algorithm> #include <iostream> #d…
这道题一开始我想的是在排序之后只在头和尾往中间靠近来找木块, 然后就WA, 事实证明这种方法是错误的. 然后参考了别人的博客.发现别人是直接暴搜, 但是加了很多剪枝, 所以不会超时. 我也想过这个做法,但是因为觉得肯定超时所以没有写, 我显然没有想到可以这么剪枝 #include<cstdio> #include<cstring> #include<functional> #include<algorithm> #define REP(i, a, b) fo…
http://acm.hdu.edu.cn/showproblem.php?pid=1455 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=243 uva开头描述: 307 - Sticks Time limit: 3.000 seconds hduoj 开头描述: E - Sticks Time Limit:3000MS     Memo…
题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics 10300 - Ecological Premium 458 - The Decoder 494 - Kindergarten Counting Game 414 - Machined Surfaces 490 - Rotating Sentences 445 - Marvelous Mazes…
题目:uva 10003 Cutting Sticks 题意:给出一根长度 l 的木棍,要截断从某些点,然后截断的花费是当前木棍的长度,求总的最小花费? 分析:典型的区间dp,事实上和石子归并是一样的,花费就是石子的和.那么久不用多说了. AC代码: #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include <map> #include <…
UVA 10003 Cutting Sticks+区间DP 纵有疾风起 题目大意 有一个长为L的木棍,木棍中间有n个切点.每次切割的费用为当前木棍的长度.求切割木棍的最小费用 输入输出 第一行是木棍的长度L,第二行是切割点的个数n,接下来的n行是切割点在木棍上的坐标. 输出切割木棍的最小费用 前话-区间dp简单入门 区间dp的入门下面博客写的非常好,我就是看的他们博客学会的,入门简单,以后的应用就得靠自己了. https://blog.csdn.net/qq_41661809/article/d…
题目连接:10003 - Cutting Sticks 题目大意:给出一个长l的木棍, 再给出n个要求切割的点,每次切割的代价是当前木棍的长度, 现在要求输出最小代价. 解题思路:区间DP, 每次查找当前区间的最优解 , 并记录.需要注意的是输入的切割点并不是从小到大. #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int N = 55; in…
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=944 题意: 有一根长度为L(L<1000)的棍子,还有n(n<50)个切割点的位置(按照从小到大排列).你的任务是在这些切割点的位置处把棍子切成n+1部分,使得总切割费用最小(每次切割的费用等于被切割的木棍长度). 分析: 设d(i,j)为切割小木棍第i点到第j点的最优…
Description    Cutting Sticks  You have to cut a wood stick into pieces. The most affordable company, The Analog Cutting Machinery, Inc. (ACM), charges money according to the length of the stick being cut. Their procedure of work requires that they o…
题文: 见:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=944(紫书p2001) 题解:区间dp,可以设dp[l][r]表示区间i到j的最小花费,所以 dp[l][r]=min(dp[l][r],DP(l,k)+DP(k,r)+cut[r]-cut[l]);k为一个断点,cut[r]-cut[l]为第一次切的花费,转移也非常显然,不过注…
题意: 有一个长为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) 最后还要注意一下输出格式中整数后面还要加一个句点. //#define LOCAL #include <iostream> #inc…
题意:把一根木棍按给定的n个点切下去,每次切的花费为切的那段木棍的长度,求最小花费. 这题出在dp入门这边,但是我看完题后有强烈的既是感,这不是以前做过的石子合并的题目变形吗? 题目其实就是把n+1根木棍合并成一只长木棍,花费为合并后的木棍长度. 于是我很开心地用优先队列敲完代码,wa了... 后来发现两个木棍的序号必须是连续的,用优先队列会把序号打乱.每次删减中间的一个数又很费时间,于是想到用list+递归,就当我得意的敲出代码,过了不少代码时,它继续给我wa了... 我非常郁闷的在board…
//这题又折腾了两天 心好累 //poj.hdu数据极弱,找虐请上uvalive 题意:给出n个数,将其分为任意份,每份里的数字和为同一个值.求每份里数字和可能的最小值. 解法:dfs+剪枝 1.按降序排序,长的木棍应该优先被使用 2.一个木棍一旦确定就不应当改变,因为新得到的木棍不会更优 3.如果当前循环扫到的第一根木棍加不进去直接return false 因为可以在后面的循环里被搜到 4.如果前一根等长的没有被使用那么不进入循环 5.份数要能整除总长度才会检查是否为合法解 #include<…
本文出自   http://blog.csdn.net/shuangde800 题目链接:  打开 题目大意 一根长为l的木棍,上面有n个"切点",每个点的位置为c[i] 要按照一定顺序把每个点都砍段,最后变成了n+1段 每砍一次,就会有一个花费,例如长度为10,“切点”为2,那么砍完后会变成两段2,8, 那么花费为2+8=10 如果有多个“切点”,那么不同顺序切会得到不同的花费. 问最小花费是多少? 思路 注意要增加一个c[n] = l f(i, j) 表示(i,j)区间的最小花费…
题意:在给出的n个结点处切断木棍,并且在切断木棍时木棍有多长就花费多长的代价,将所有结点切断,并且使代价最小. 思路:设DP[i][j]为,从i,j点切开的木材,完成切割需要的cost,显然对于所有DP[i][i+1]=0,记w[i][j]为从i,j点切开的木材的长度,因此可以枚举切割点,dp[i][j]=min(dp[i][k]+dp[k][j])+w[i][j],k就是枚举的切割点. AC代码: #include<cstdio> #include<cstring> #inclu…
首先排个序,然后找一次0花费,然后再找一次0花费,然后再找一次0花费,然后再找一次0花费......... 最后看找了几次,+1就是答案 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cstdlib> #include<vector> using namespace std; struct node { int l,…
区间dp,切割dp[i][j]的花费和切法无关(无后效性) dp[i][j]表示区间i,j的花费,于是只要枚举切割方法就行了,区间就划分成更小的区间了.O(n^3) 四边形不等式尚待学习 #include<bits/stdc++.h> //变量不要取成ignore left之类 using namespace std; ; int cut[maxn]; int dp[maxn][maxn]; const int INF = 0x3fffffff; int main() { //freopen(…
[Link]: [Description] 给你一根长度为l的棍子; 然后有n个切割点; 要求在每个切割点都要切割一下; 这样,最后就能形成n+1根小棍子了; 问你怎样切割,消耗的体力最小; 认为,消耗的体力,为每次切的那根棍子的长度; [Solution] 在开头增加一个位置0,在结尾增加一个位点L; 这样,在算长度的时候比较好算一点; 长度不再是一点一点的了,而是一段一段的; (即i..i+1代表了一段); 设f[i][j]表示,将i..j这一段切掉需要花费的最小体力值; 则在记忆化搜索中枚…
题意:有一根长度为L(L<1000)的棍子,还有n(n < 50)个切割点的位置(按照从小到大排列).你的任务是在这些切割点的位置处把棍子切成n+1部分,使得总切割费用最小.每次切割的费用等于被切割的木棍长度. 分析: 1.solve(i, j)为切割小木棍i~j的最优费用. 2.设k(i<k<j),solve(i, j) = min{solve(i, k) + solve(k, j)} + a[j] - a[i]. k是切割小木棍i~j费用最优的切割点,a[j] - a[i] 为…
题意:对一根长为l的木棒进行切割,给出n个切割点,每次切割的价值,等于需要切割的木头长度. 一开始理解错了,认为切割点时根据当前木条的左端点往右推算. 实际上,左端点始终是不变的一直是0,右端点一直是l,切割点就是在0 ~ l 之间的点,而切割时的价值就是切割这个点的时候当前木条的长度. 状态转移方程:dp[i][j] = min(dp[i][j],dp[i][k] + dp[k + 1][j] + cut[j] - cut[i]); 思路就是朝着子区间最优的情况靠拢,然后再求全局最优,由于子结…
Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 126238   Accepted: 29477 Description George took sticks of the same length and cut them randomly until all parts became at most 50 units long. Now he wants to return sticks to the or…
由于,这两题有着似乎一样的解法所以将其放在一起总结比較,以达到更好的区分二者的差别所在. 一.区间DP uva的Cutting Sticks是一道典型的模板题. 题目描写叙述: 有一根长度为l的木棍,木棍上面有m个分割点,每一次分割都要付出当前木棍长度的代价,问如何分割有最小代价. 区间DP的定义: 区间动态规划问题一般都是考虑.对于每段区间,他们的最优值都是由几段更小区间的最优值得到,是分治思想的一种应用.将一个区间问题不断划分为更小的区间直至一个元素组成的区间,枚举他们的组合,求合并后的最优…
小木棍Sticks[传送门] 算法的话:dfs+超强剪枝: (另外注意UVA上好像不接受万能头[因为万能头WA了两次,瑟瑟发抖]) 思路: 最直接的思路,枚举木棍长度来dfs,但这样很容易就TLE了. dfs的四项关键字: 1.num:剩多少切割后的木棍没有使用: 2.rest:还需要rest的长度可以凑成一个切割前的木棍: 3.len:切割前的木棍长度: 4.last:当前切割后的木棍起始的下标:(对于初始状态dfs last是1还是0好迷啊,好像初始状态是1或者0都可以ac???) 行吧就当…
UVA 11992 - Fast Matrix Operations 给定一个r*c(r<=20,r*c<=1e6)的矩阵,其元素都是0,现在对其子矩阵进行操作. 1 x1 y1 x2 y2 val 表示将(x1,y1,x2,y2)(x1<=x2,y1<=y2)子矩阵中的所有元素add上val: 2 x1 y1 x2 y2 val 表示将(x1,y1,x2,y2)(x1<=x2,y1<=y2)子矩阵中的所有元素set为val: 3 x1 y1 x2 y2 val 表示输…
Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 15564    Accepted Submission(s): 6405 Problem Description There is a pile of n wooden sticks. The length and weight of each stick a…
字典树优化DP                                Remember the Word Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu [Submit]   [Go Back]   [Status] Description   Neal is very curious about combinatorial problems, and now here comes a p…