hduoj 1455 && uva 243 E - Sticks】的更多相关文章

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…
题目: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…
//这题又折腾了两天 心好累 //poj.hdu数据极弱,找虐请上uvalive 题意:给出n个数,将其分为任意份,每份里的数字和为同一个值.求每份里数字和可能的最小值. 解法:dfs+剪枝 1.按降序排序,长的木棍应该优先被使用 2.一个木棍一旦确定就不应当改变,因为新得到的木棍不会更优 3.如果当前循环扫到的第一根木棍加不进去直接return false 因为可以在后面的循环里被搜到 4.如果前一根等长的没有被使用那么不进入循环 5.份数要能整除总长度才会检查是否为合法解 #include<…
题目连接: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…
题意:把一根木棍按给定的n个点切下去,每次切的花费为切的那段木棍的长度,求最小花费. 这题出在dp入门这边,但是我看完题后有强烈的既是感,这不是以前做过的石子合并的题目变形吗? 题目其实就是把n+1根木棍合并成一只长木棍,花费为合并后的木棍长度. 于是我很开心地用优先队列敲完代码,wa了... 后来发现两个木棍的序号必须是连续的,用优先队列会把序号打乱.每次删减中间的一个数又很费时间,于是想到用list+递归,就当我得意的敲出代码,过了不少代码时,它继续给我wa了... 我非常郁闷的在board…
本文出自   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] 给你最多n个棍子; (n< = 64) 每根棍子长度(1..50) 问你这n根棍子,可以是由多少根长度为x的棍子分割出来的; x要求最小 [Solution] 首先,将各根棍子的长度求和->sum 最后的长度x肯定是sum的因子; 则枚举x从各根棍子长度的最大值到sum作为因子; 枚举量假设为len; 然后一直用剩余的棍子去凑这个长度len 凑够了,就重新选择剩下的棍子,继续凑len; 剪枝: 1.还需要凑的量为len,但是尝试用完某根棍子之后,无法…
题意:有一根长度为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] 为…
Sticks Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1455 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…
由于,这两题有着似乎一样的解法所以将其放在一起总结比較,以达到更好的区分二者的差别所在. 一.区间DP uva的Cutting Sticks是一道典型的模板题. 题目描写叙述: 有一根长度为l的木棍,木棍上面有m个分割点,每一次分割都要付出当前木棍长度的代价,问如何分割有最小代价. 区间DP的定义: 区间动态规划问题一般都是考虑.对于每段区间,他们的最优值都是由几段更小区间的最优值得到,是分治思想的一种应用.将一个区间问题不断划分为更小的区间直至一个元素组成的区间,枚举他们的组合,求合并后的最优…
[SinGuLaRiTy-1026] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. [UVA 1025] A Spy in the Metro 题目描述 特工玛利亚被送到S市执行一个特别危险的任务.她需要利用地铁完成他的任务,S市的地铁只有一条线路运行,所以并不复杂. 玛利亚有一个任务,现在的时间为0,她要从第一个站出发,并在最后一站的间谍碰头.玛利亚知道有一个强大的组织正在追踪她,她知道如果一直呆在一个车站,她会有很大的被抓的风险,躲…
  区间DP主要思想是先在小区间取得最优解,然后小区间合并时更新大区间的最优解.       基本代码: //mst(dp,0) 初始化DP数组 ;i<=n;i++) { dp[i][i]=初始值 } ;len<=n;len++) //区间长度 ;i<=n;i++) //枚举起点 { ; //区间终点 if(j>n) break; //越界结束 for(int k=i;k<j;k++) //枚举分割点,构造状态转移方程 { dp[i][j]=max(dp[i][j],dp[i…
Sticks  [题目链接]:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=243 [ 随 笔 ]:很久之前就遇到这道题,题目意思容易理解,后来自己想到了一个法子,思路也很清晰就将代码敲出来了,用了位运算(后来问师兄是说状态压缩,其实我不知道什么是状态压缩~_~),不过提交的时候超时了,我想着优化代码,尽可能…
Sticks(UVA - 307) 题目链接 算法 DFS+剪枝 1.这道题题意就是说原本有一些等长的木棍,后来把它们切割,切割成一个个最长为50单位长度的小木棍,现在想让你把它们组合成一个个等长的大木棍,要求这个拼接成的大木棍的长度最小.问最小长度是多少.(注意,在接下来的介绍中,将最后的大木棍表述为拼接木棍,小木棍还是叫小木棍) 2.看完这个题,基本思路是从一个小木棍开始找,找到一个未使用的小木棍后拼接,当拼接成的长度是所有小木棍长度和的约数时,就暂时把它定义为拼接木棍的最小长度,然后计算最…
题目大意: George有许多长度相同的木棍,随机的将这些木棍砍成小木条,每个小木条的长度都是整数单位(长度区间[1, 50]).现在George又想把这些小木棒拼接成原始的状态,但是他忘记了原来他有多少根木棍,也忘记了木棍的长度.现在请你编写一个程序,找到最短的原始的木棍长度. 输入: 每个测试案例包含两行,第一行表示小木条的总个数(最多64根小木条),第二行表示每个小木条的长度,用空格分开.当第一行输入为零的时候表示程序结束. 输出: 对于每个测试案例输出最短的木棍长度. 解题思路: 用搜索…
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 original state, but he forgot how many sticks he had originally and how long they were originally. Please h…
Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 14667    Accepted Submission(s): 4517 Problem Description George took sticks of the same length and cut them randomly until all parts beca…
题意:找最短的木棍可以组成的长度, hdoj  1518 的加强版 代码: #include <stdio.h> #include <string.h> #include <algorithm> using std::sort; #define M 70 int s[M], vis[M]; int n, ans; int cmp(int a, int b) { return a > b; } int dfs(int cou, int cur, int pos) {…
中文题 (一般都比较坑) 思路: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…
题文: 见: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…
DFS.搜索以棍数为条件循环搜索较好,这样不会超时. #include <stdio.h> #include <string.h> #include <stdlib.h> #define true 1 #define false 0 #define MAXN 70 int alen; int parts[MAXN]; char visit[MAXN]; int n, m; int dfs(int beg, int cnt, int len) { int i; ) { +…
题意: 平面上有\(n\)个点,有一种操作和一种查询: \(road \, A \, B\):在\(a\),\(b\)两点之间加一条边 \(line C\):询问直线\(y=C\)经过的连通分量的个数以及这些连通分量点的总数 分析: 其实横坐标是没用的,首先可以先将纵坐标离散化. 用并查集维护点的连通性,连通分量的大小以及连通分量中纵坐标的最大值和最小值. 线段树中维护的是每条直线穿过的连通分量的个数以及点的个数之和. 当两个连通分量合并时,先把两个小连通分量从线段树中删去,然后再把合并之后的大…
[Link]: [Description] 给你一根长度为l的棍子; 然后有n个切割点; 要求在每个切割点都要切割一下; 这样,最后就能形成n+1根小棍子了; 问你怎样切割,消耗的体力最小; 认为,消耗的体力,为每次切的那根棍子的长度; [Solution] 在开头增加一个位置0,在结尾增加一个位点L; 这样,在算长度的时候比较好算一点; 长度不再是一点一点的了,而是一段一段的; (即i..i+1代表了一段); 设f[i][j]表示,将i..j这一段切掉需要花费的最小体力值; 则在记忆化搜索中枚…