- 博客(47)
- 收藏
- 关注
原创 UVA 607-Scheduling Lectures(贪心+DP)
题目大意:有n(n大于等于1小于等于1000)个主题,每个主题要花费t1,t2,……,tn(每个ti都不会大于L)的时间来讲,每个讲座L(L大于等于1小于等于500)分钟;安排讲座有两个规则:不能讲一个主题分在两个讲座讲;必须按顺序讲,即ti要在ti-1之后讲。每个讲座都有一个DI值,(即不满意值)设t为提前下课的分钟数,则:DI=0(若t=0)或DI=-C(若t大于等于1小于等于
2015-04-28 23:14:30
574
原创 UVA 590-Always on the run(DP)
题目大意:有若干城市,有些城市可以到达并且有花费,初始在城市1,要求旅游k天,并且最终在城市n,求是否能达到,若能求最小花费。用d[i][j]表示第i天在城市j的最小花费,从d[i-1][u]递推而来,其中u是第i-1天所在的城市。#include#includeint a[40][40][100];int d[1100][30];int main(void){
2015-04-28 23:05:45
697
原创 UVA 473-Raucous Rockers(DP)
题目大意:有n首歌,m个光盘,每个光盘最多能放t时间的歌,给出每首歌的长度,必须按顺序录入光盘(可以选择不录某几首歌),最多能录多少首歌。用d[i][j][0]表示前i首歌,放j首,最少用多少个光盘,用d[i][j][1]表示前i首歌,放j首,在光盘最少的前提下,最后一个光盘可以剩余的最多容量。根据是否放第i首歌完成递推。这样递推是正确的,因为前i首歌,放j首的情况下,最佳的情
2015-04-28 22:55:44
612
原创 UVA 442-Matrix Chain Multiplication(栈的运用)
题目大意:给出一个矩阵乘法式子,其中每个矩阵的行列已知,求最终的结果。表达式的运算,关于栈的运用,运算过程中碰到两个不匹配的矩阵时,则矩阵序列错误。#include#include#includeint a[60][3];char b[300];int c[300][2];int top=0;int main(void){ int i,n,arow,aco
2015-04-28 22:40:49
589
原创 UVA 437-The Tower of Babylon(DP)
题目大意:给定n个长方体砖块,每个有长宽高,要求搭成一座塔,对于每个砖块,可以任意旋转,搭在下面的长和宽必须大于上面的。求最高搭多高的塔。对于每种砖块,转成3种(或2种和1种),它们的高不同,之后动态规划。状态转移方程:d[i]=max { d[j]+a[i] } (i能放在j下面),d[i]表示以i为起始点时的最高的塔。#include#includeint a[
2015-04-15 13:14:49
551
原创 UVA 10254-The Priest Mathematician(大数+递推)
题目大意:在原本的汉诺塔游戏基础上加一根柱子,移动策略是:要移动N个汉诺塔,先用4根柱子把K个到一个柱子,然后用其余3根把剩下的N-K个移动到目标柱子,再用4根把初始的K个移动到目标柱子。关键的问题是找到每个N的K是多少,观察可以发现规律是:随着K的递增,其实移动的次数Fn(K)先递增后递减,然后F1(K),F2(K),...的最大值随着K的增大递增。要形式化证明似乎比较困难。。不过在
2015-04-15 12:59:21
735
原创 UVA 10453-Make Palindrome(DP)
题目大意:给出一串字符串,可以在任意位置加入字符,问最少加入多少个能组成回文串,并输出回文串。用d[i][j]表示[i...j]的序列组成回文串最少要加入多少个字符,考虑最左边的和最右边的字符,有3种情况:1.最左边的和最右边的相等,并匹配,转移到[i+1...j-1],2.最左边的和额外添加在右边的匹配,转移到[i+1...j]+1,3.最右边的和额外添加在左边的匹配,转
2015-03-11 20:16:01
427
原创 UVA 10163-Storage Keepers(DP)
题目大意:有N(1先dp一次,求出可能的最大总安全度max,再次dp,求出在安全度为max下的最小花费。第一次dp:用d[i][j]表示用i个人看守j个仓库能搭成的最大总安全度,用a[i]表示第i个人的能力值。状态转移方程:d[i][j]=max { d[i-1][j],min { d[i-1][j-u],a[i]/u } }(a[i]/u>d[i-1][j] && u>0)
2015-03-11 15:02:59
546
原创 UVA 1252-Twenty Questions(状态压缩DP+子集枚举)
题目大意:有n个物品,每个物品有m个特征,每个物品的每个特征都可能有或没有,现在假定某个物品,通过询问某些特征来确定这个物品,问最多需要多少次就可以确定物品。每次询问之后可能根据答案不同来采取不同的进一步询问的策略。用d[S][S0]表示目前询问了S,得到的回答是S0(即那个物品在S中有S0这些特征),最少还需询问多少次。枚举下一次询问的特征完成递推。最终d[0][0]就是答案。S
2015-03-11 00:44:29
906
原创 UVA 1291-Dance Dance Revolution(DP)
题目大意:有4个位置,每次从一个位置移动到另一个位置需要特定花费,求一串指定序列的最短花费。每次只能一只脚移动,或移动并踩下。用d[i][j][u]表示前i个位置完成且在(j,u)的状态最小花费是多少,(j,u)其中之一必须和a[i]相等,假设是j和a[i]相等,那么可能上一个状态也是(j,u),或者上一个状态是(k,u),注意上一个状态不能是(j,k),因为这样需要左脚踩踏,右脚移动
2015-03-10 23:26:12
691
原创 UVA 1351-String Compression(KMP算法+DP)
题目大意:给出一串长度不超过200的字符串,相同的部分可以压缩,如ababab可压缩为3(ab),求压缩的最小长度。容易证明如果一个字符串是周期串,那么要么不压缩,要么以最短的循环串压缩。这里我是用KMP算法预处理出所有子串是否是周期串,若是,计算出最短循环串是多少。递推部分和矩阵链乘相似。用d[i][j]表示从第i个字符到第j个字符的串的最短表示要多少个字符,若str[i...j
2015-03-10 00:30:53
723
原创 UVA 1292-Strategic game(树形DP)
题目大意:给出一棵树,在某个选择某个结点可以覆盖和它相连的所有边,问最少选多少个结点所有边都被覆盖。首先将无根树转化为有根树,0为根。用d[i][0]表示不选择结点i时覆盖以结点i为根的子树最少要多少个结点,用d[i][1]表示选择结点i时覆盖以结点i为根的子树最少要多少个结点。若结点i不选,为了和覆盖所有和结点i相连的结点,则每个儿子都必须选,若结点i选,则每个儿子选择较小的那个
2015-03-10 00:22:20
537
原创 UVA 10817-Headmaster’s Headache(状态压缩DP)
题目大意:有S(S用d[i][j]表示前i名老师状态为j的情况下最少的花费,j是S位三进制数,对于每一位三进制位u,为0时表示课程u当前没有老师教,为1表示课程u当前有一名老师教,为2表示课程u当前有两名老师教。最终答案为d[N][3^S-1]。计算d[i][j]时,考虑是否雇佣第i位老师完成状态转移,如果雇佣,那么尽量充分利用这个老师所教的课程,对于这个老师教的每一门课,如果当前
2015-03-09 00:36:26
944
原创 UVA 10564-Paths through the Hourglass(DP)
题目大意:给出一个沙漏,包含一个倒三角和一个三角,每个方格有一个0到9的数字,从顶上某格走到底下某格,求得到一个特殊值的路径有多少条,并输出字典序最小的。路径用一个起点和一系列'L'和'R'的字符表示。用a[i][j]表示第i行第j列的数字。由于要求字典序最小的,所以从下往上递推。用d[i][j][u]表示在(i,j)且和为u的路径有多少条,在上半部分是倒三角,可以由d[i+1][j]
2015-03-09 00:16:22
489
原创 UVA 1366-Martian Minging(DP)
题目大意:有一个n(1用d[i][j]表示到第i行第j列时,前i行j列能产生的最大的矿数量,用a[i][j]表示在第i行从第1列加到第j列的yeyenum矿,用b[i][j]表示bloggium矿在第j列从第1行加到第i行,根据第i行第j列的格子向左还是向上递推,要么向左,第i行全部向左,要么向上,第j列全部向上。状态转移方程:d[i][j]=max { d[i-1][j]
2015-03-08 00:56:20
825
原创 UVA 1452-Jump(DP)
题目大意:约瑟夫问题,求最后被删除的三个人的编号,编号从1开始。用d[i][0]表示倒数第三个被删除的,d[i][1]表示倒数第二个,d[i][2]表示最后一个。考虑删除掉第一个人以后从d[i-1][0…2]递推而来。对d[i-1][0…2]重新编号以完成递推(实际上d[i][0…2]可以看成对于第一个人的相对偏移位置)。状态转移方程:d[i][0]=(d[i-1][0]+(m
2015-03-08 00:30:17
665
原创 UVA 11795-Mega Man’s Mission(状态压缩DP)
题目大意:有N(1用d[S]表示消灭状态为S(二进制)的怪物有多少种顺序,用c[S]表示消灭完S之后的武器。d[S]通过枚举最后消灭的是哪一个怪物来递推,前提是消灭除了它之外的怪物以后拿到的所有武器能消灭它。c[S]通过取最低位来计算,即c[S]=c[S&-S]|c[S-(S&-S)]。#include#includetypedef long long LL;ch
2015-03-07 14:11:45
854
原创 UVA 1456-Cellular Network(DP)
题目大意:给出一系列数,将它们分成m部分,若第i部分数的和是Ai,第1部分到第i部分总共有Bi个数,那么sum=A1*B1+A1*B2+...+Am*Bm,求最小的和。首先排序,大的在前面,然后按照这样的顺序分组,每一组的必定是连续的数,这可以通过相邻交换法容易证明。用d[i][j]表示i个数分成j部分,用sum[i]表示前i个数之和,枚举第j部分有哪些数完成递推。状态
2015-03-07 13:42:51
727
原创 UVA 11404-Palindromic Subsequence(DP)
题目大意:给出一个字符串,找出长度最长的回文子串,若有多个,找出字典序最小的。用d[i][j]表示第i个字符到第j个字符的最长回文子串的长度。用b[i][j]表示第i个字符之后最近的一个值为j+’a’的字符的位置,用c[i][j]表示第i个字符之前最近的一个值为j+’a’的字符的位置。a[i]表示第i个字符,n表示字符串长度。容易递推计算出d数组:d[i][j]=d[i+1][
2015-03-07 00:22:07
635
原创 UVA 11552-Fewest Flops(DP)
题目大意:给出只含小写字符的字符串,长度能被k整除,现在每k个字符分成一组,每组内可以随意排列。连续相同字符组成的子串称为一块,例如aabccc有3块,求分组每组内重排之后的最少块数。用d[i][j]表示前i组并且第i组由第j个小写字符结尾的串,最少的块数,如果第i组不含第j个小写字母,那么d[i][j]=INF。根据第i-1组结尾的字符是什么递推。假设为d[i-1][u]。在递推时,
2015-03-07 00:04:38
745
原创 UVA 10534-Wavio Sequence(LIS)
题目大意:Wavio序列是关于整数的序列,有这样的性质:1.长度为奇数,L=2*n+12.前n+1项严格递增3.后n+1项严格递减4.相邻的两个数不相等给出n个数的序列,求出其中最长的Wavio子序列的长度。依次对每个元素求以它为结束的最长上升子序列和以它为开始的最长下降子序列,b[i]为以i为最后一个元素的最长上升子序列,c[i]为以i为第一个元素的最长下降子序列
2015-03-06 00:30:14
668
原创 UVA 11584-Partitioning by Palindromes(DP)
题目大意:给出一个字符串,将它划分成尽量少的子串,使得每个子串都是回文串。首先预处理出每个子串是否是回文串,b[i][j]=1表示子串a[i...j]是回文串,b[i][j]=0表示子串a[i...j]不是回文串。用d[i]表示前i个字符的最少划分数。枚举最后一个划分是在哪从而完成递推。状态转移方程:d[i]=min { d[u]+1 }(b[u+1][i]==1)
2015-03-06 00:17:41
421
原创 UVA 1424-Salesmen(DP)
题目大意:给出一个连通图和一个序列,求改变尽量少的序列中的元素,使得相邻两个元素相同或在图中相邻。a[i][j]=1表示i和j相邻,a[i][j]=0表示i和j不相邻。b[i]表示序列中第i个数。用d[i][j]表示前i个数且第i个数为元素j时的最少改变数量,由d[i-1][u]推来。其中j和u相同或相邻。状态转移方程:d[i][j]=min { d[i-1][u]+k
2015-03-02 00:14:13
885
原创 POJ 3411-Paid Roads(状态压缩+dijkstra算法+floyd-warshall算法)
题目大意:给出一张有向图,求点1到点N的最短路,不同的是,对于每一条边,除了源点目标点和花费以外,还有额外点c,若走这条边之前到达过c点,花费会减少到另一个值P。如果最短路不存在,输出impossible。先用floyd-warshall算法判断连通性,此时忽略额外的c和P。然后用dijkstra算法,用d[i][S]表示在点i且经过了S集合的点的最短路,将每一个d[i][S]都看
2015-03-01 23:10:23
640
原创 POJ 3268-Silver Cow Party(dijkstra算法)
题目大意:给出一个单向带权图和一个点s,求点u,u到s的最短路径和s到u的最短路径之和最大。先求一次dijkstra,然后把所有的边反向,权值不变,再求一次dijkstra,将两者加起来求最大的值就是所求的答案。#include#include#include#includeusing namespace std;const int maxn=1010;cons
2015-03-01 23:03:27
821
原创 UVA 1633-Dyslexic Gollum(状态压缩DP)
题目大意:求长度为N(1用d[i][j][u]表示长度为i且后11个01串组成数j且不含长度大于或等于u的01串有多少个。如果j中含有长度至少为u的回文串,那么d[i][j][u]=0。否则,假设d[i][j][u]可以由d[i-1][v][u]转移得来。根据状态的表示,那么v的低10位肯定是u的高10位,v的最高一位可以为0或1,即v=j/2或v=j/2+(1程序将表打出
2015-02-28 13:23:02
1598
原创 UVA 1632-Alibaba(DP)
题目大意:在一条直线上有n(na[i]表示第i个宝藏的位置,b[i]表示消失的时间。首先注意到对于任意区间(i,j),拿完所有宝藏之后必然在i或j两者之一。所以用d[i][j][0]表示拿完第i个到第j个之间的所有宝藏,且最后位于i,用d[i][j][1]表示拿完第i个到第j个之间的所有宝藏且最后位于j。程序用滚动数组优化内存消耗,递推是按照区间的宽度递增的顺序,所以也是按照这
2015-02-28 00:48:16
2318
原创 UVA 1631-Locker(DP)
题目大意:给出两串长度为n(n首先假定,对于任意操作,把最后一个操作数当做操作的操作数。比如000一步变为111把操作数看成第3个数。预处理出数组cost,cost[i][j]表示在只有最后一个数字是操作数的情况下,从数字i变到数字j要的最少步数(i,j222->221-->220。用a[i]和b[i]表示源数字串和目标数字串的第i个数字。用d[i][j]表示前i个
2015-02-28 00:36:17
1599
原创 UVA 12166-Equilibrium Mobile(推导结论)
题目大意:给出一棵二叉树,整个树是天平,每个结点有一个砝码或一个天平,对于任意一个天平,绳子都在中点,每个砝码都有重量,求最少修改多少个砝码的重量使得整个天平平衡。本题的关键在于一个结论:若最终天平平衡,则在同一个深度的所有结点,无论它的祖先结点是什么,重量都应该相同。并且上一层的重量应该是下一层的2倍。证明其实是显然的。。之后只需要把所有的结点分块,然后取结点最多的块,其余的结点
2015-02-27 13:47:41
1443
原创 POJ 1297-Supermarket(DP)
题目大意:有M(1用d[i][j]表示当前买了列表的前i个物品并且走完了街道的前j个摊子的最小花费,那么分两种情况,如果第j个摊子卖的和在列表上第i个商品相同,那么可能从d[i-1][j-1]推来或d[i][j-1],即第j个摊子买或不买,若第j个摊子卖的不是列表上的第i个商品,那么就直接由d[i][j-1]推来。程序中用滚动数组从而在空间上压缩了一维状态。状态转移方程
2015-02-27 01:07:07
609
原创 UVA 10767-Barcelona’s trams(DP+数学推导)
题目大意:有一个列车,要走n个路段,每个路段有一定的长度。初始时,最大速度是M,每次在一个路段要开始的时候,司机可以选择一个速度,在(0,M]之间的任意值v。则发生冲突的概率是v/M,如果发生冲突,那么将会需要10秒恢复并且以恒定的速度5运行到这个路段完毕。并且如果发生冲突,M的值会少1(这样会对后面的路段有影响)。求运行完所有路段的最小花费时间。如果发生冲突,那么假设冲突在中点发生。还有些细节参
2015-02-26 15:33:04
768
原创 POJ 1440-Varacious Steve(DP)
题目大意:Steve和Digit轮流取甜甜圈,有n个,每次不能取超过m个(1用d[i][j][u][0]表示目前总共有i个甜甜圈,其中j个还未被取,u个在Steve处,且下一步到Steve走时,Steve能吃到的最多的甜甜圈,用d[i][j][u][1]表示目前总共有i个,j个未取,u个在Steve处,且下一步到Digit走时,Digit能吃到的最多的甜甜圈。状态转移方程:
2015-02-25 23:55:28
1313
原创 POJ 1189-钉子和小球(DP)
第i层有2*i+1种可能的位置(从第1个空位到最后一个空位总共i+1个和i个钉子位置),用d[i][j]表示第i行在第j个位置掉落的概率的分子(分母是2^i)。如果位置是空位,那么有3种情况:(1).从上一个同样的位置掉落下来,(2).掉落到左边的钉子(如果有)并向右走,(3).掉落到右边的钉子(如果有)并向左走。如果位置是有钉子的,有2种情况:(1).这个
2015-02-25 23:35:17
840
原创 POJ 1187-陨石的秘密(DP)
用d[i][j][u][v]表示i个{},j个[],u个(),深度为v的序列数,根据最后一个子括号(就是最后一个反括号对应的正括号范围内的括号)分类计数。最后一个子括号可能深度小于v,此时前面的括号深度必须为v,最后一个子括号深度也可能等于v,此时前面的括号深度可以小于或等于v。用sum[i][j][u][v]表示i个{},j个[],u个(),深度小于等于v的序列数。没递推完i,j
2015-02-25 23:28:09
996
原创 UVA 11252-Take Me Home (To the Place I Belong)(DP)
题目大意:有几种包裹需要打包,每种包括有一定的体积,每种包裹可能有多个。有一个运输公司提供了多种包裹服务,每种有一定的尺寸和价格,多加一种服务需要多付一定数量的钱。为了节省掉这一部分的钱,小的包裹可以使用大尺寸来运输,但大的不能用小的来运输,求最小价格。首先对服务排序,根据尺寸从大到小排序,如果有某些服务相对于某个其他的服务,尺寸小价格反而贵,则这种服务直接舍去。然后对包裹按尺寸从
2015-02-24 20:10:39
628
原创 UVA 10645-Menu(DP)
题目大意:Alfred要准备一些菜,每天一道菜,每个菜有收益和花费,如果连续两天准备同一道菜,收益减半,连续三天或更多,则不获得好感值,求在预算内的最多收益并输出每一天准备的菜。如果多个情况能获得相同的收益,输出花费较少的,如果还有多个,随意输出。用d[i][j][u][0]表示前i天,花费至少j,第i天为第u道菜且第i-1天不为第u道菜时,最大的收益,用d[i][j][u][1]
2015-02-24 19:47:12
585
原创 POJ 2229-Sumsets(DP)
题目大意:只用2的次方数(1,2,4,8…)组成N(1此题直接用完全背包会超时。用d[i]表示组成i有多少种方法,考虑组成中是否有1,有两种情况,至少有1个1,那么此时剩下的i-1随意组合,或者没有1,那么只能由2,4,8…组成,此时将它们除以2便得到1,2,4,8…,即组成i/2时的方案数。状态转移方程:d[i]=d[i-1]+d[i/2](i%2==0)d[i]
2015-02-24 19:43:01
420
原创 UVA 1513-Movie collection(树状数组)
题目大意:有n个电影碟,要看m次电影(1用数组模拟栈,只不过栈有些元素可能是空的,每次拿出后放在栈顶,并随时更新每个电影对应的在栈中的位置,求在它上面的电影数就是对数组求和。每次拿出把这个位置的值置为0,即减1,在栈顶放入就在栈顶加1,最终求和。#include#includeint a[100010];int b[35];int c[275000];int an
2015-02-24 19:37:13
428
原创 UVA 1314-Hidden Password(后缀数组)
题目大意:有一串长度为L(5首先将字符串在原字符串后拼接一次得到长度为2*L的字符串。用后缀数组计算各个后缀的长度为L的前缀就可以得出答案,计算完毕之后利用x数组可以求得起始点最小的。首先预处理出得到L的操作,起始数为1,操作包含两种:加1和乘2,对后缀数组的倍增模板修改使得它能完成加1的操作。#include#includechar s[200010]
2015-02-24 19:30:33
483
原创 UVA 536-Tree Recovery(二叉树恢复)
题目大意:给出二叉树的前序和中序遍历,输出后序遍历。递归处理,每次找到当前的根结点,然后递归左子树和右子树。#include#include#includechar a[30];char b[30];int c[370];void dfs(int i,int j,int u);int main(void){ int i,lo; while(scanf("
2015-02-24 19:25:10
479
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人