![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
UVa
姚灯灯
programonkey
展开
-
UVA 103--- Stacking Boxes
这道题在小白书中的分类是动态规划,把题AC了之后在网上看解题报告后,多数解法也是DAG上的动态规划。但其实一个简单的深度优先就能解决问题了。首先将每数从大到小排序,再将各组按照排序后的第一个数字的大小进行从大到小排序。需要注意的是,记录各组数据的编号也要和数进行同步的排序。#include #include #include #include #include using names原创 2015-02-05 10:11:05 · 707 阅读 · 0 评论 -
UVa 11825 Hackers’ Crackdown
参照大白书上面的解法,总共三个步骤,前两个步骤都较好理解。P[i]是用位表示的当选中i时,总共有0~n-1总共有多少个数字被覆盖。cover[S]则表示,当子集为S时,0~n-1中能够被覆盖的位数。若cover[S]的每位都为1,则说明子集S能对全集进行覆盖,当然可能子集S的子集就能做到这一点了。关键的步骤是对状态转移方程的理解。书中的状态转移方程是f(S)=max{f(S0)|S0是S的子集原创 2015-04-06 19:57:21 · 763 阅读 · 0 评论 -
UVa 11029 Leading and Trailing
题目要求输出N的K次方的前三位和后三位。后三位的解法不用多说了,用二分法快速去模即可。关键是前三位怎么求?题目中说N能用32位带符号整数表示,K最大是10的六次方。因此N^K的解ans最多不过10^(9*10^6),因此我们完全可以用以十为底的对数x+y表示,其中x表示对数的整数部分,y表示对数的小数部分。显然,ans的具体数字是由10^y来表示的,而x只是用来将小数以为成整数而已。并且可以确定的原创 2015-02-25 12:48:59 · 1035 阅读 · 0 评论 -
UVa 10253 Series-Parallel Networks
《训练指南》中的第二种算法,其实本质上就是个背包。d[i][j]表示,在子树的节点数最大为i的情况下,j个节点的解。当之前的i-1,i-2,....0的结果都已知的时候,d[i][j]自然可根据下式求解:d[i][j]=sum{C(f(i)+p-1,p)*d[i-1][j-p*i] | p*i其中f(i)表示恰好有i个节点的子树的数量。而C(f(i)+p-1,p)则表示有p棵i节点子树形成原创 2015-02-23 15:57:37 · 750 阅读 · 0 评论 -
UVa 11375 Matches
大年夜的写代码果然状态非常之差...感觉特别困,连个高精度都折腾了我好久。还是刘汝佳《训练指南》里的一道例题,解题思路其实也差不多,但是想对书里面的内容再讲讲。其中d[i]是代表i个火柴棒恰好能构成的正整数数目(不包含整数0),然后有点类似于动态规划的做法,通过已知的d[]求出剩下的d[]。 不过仔细想来貌似有点问题。例如已知d[j],那么d[j+num[0]]+=d[j].那么新原创 2015-02-18 22:14:20 · 911 阅读 · 0 评论 -
UVA 11806 Cheerleaders
刘汝佳《训练指南》里的一道例题。典型的容斥原理的应用。设C(M*N,K)为在M行,N列里放K个数的方案数。因为要求第一列,最后一列,第一行,最后一行都有放置,显然答案为:C(M*N,K)-(2*C(M*(N-1),K)+2*C((M-1)*N,K))+(4*C((M-1)*(N-1),K)+C(N*(M-2),K)+C((N-2)*M,K))-(2*C((N-2)*(M-1),K)+2*C((原创 2015-02-17 16:16:35 · 1013 阅读 · 0 评论 -
UVa 11361 Investigating Div-Sum Property
这道题居然提交了十次才过....期间小问题不断。思路的话基本是《训练指南》里面来的,不过有几个小问题需要注意一下。第一,当K在大于100的情况下,就直接输出0就可以了。因为a,b不超过2^31,可以估算出a,b最多十位十进制数,那么每位最大为9,所以各个数字之和是不可能超过100的,那么个数字之和为模K为0的条件是永远不可能到达的。 还有一点是,当剩余数字d=0时,当且仅当m1和m2原创 2015-02-22 16:46:13 · 1102 阅读 · 0 评论 -
UVa 10003 Cutting Sticks
类似于最有二叉排序树的解法。假设有N个切割点,则整条木棍有N+2个端点(包括起点0,终点N+1)。设d(i,j)为子问题序号i~j的木棍的最优解,则可得状态转移方程:d(i,j)={length(i,j)+max(d(i,k),d(k,j)),i在具体求解的过程中,应当把所有子问题的解都求出来,首先计算i,j之间没有端点的情况,继而推广到间隔1个端点,2个端点,...N个端点。则最后当间隔为N原创 2015-02-10 11:50:09 · 708 阅读 · 0 评论 -
UVa 1362(LA 3516) Exploring Pyramids
依旧是《训练指南》上的一道例题。思路大致相同,即设有一个序列S(i),S(i+1),S(i+2)...S(j),d[i,j]为所求的解。当S(i)==S(k),id[i,j]+=d[i+1,k-1]*d[k,j]直到k>j。最后的d[i,j]就是序列S(i)..S(j)的解。那么题目最终的解即为d[0,n-1],n为序列的长度。不过,在具体的解法上,我和书上的做法不一样。书上使用的是递归,而我原创 2015-02-21 16:53:17 · 1459 阅读 · 0 评论 -
UVa 11174 Stand in a Line
依旧是《训练指南》上的一道例题。书上讲的比较抽象,下面就把解法具体一下。因为涉及到父子关系,因此自然而然可以将n个节点构造成一棵树,最后将形成一个森林。接下来将使用递归的手法。设f(i)是以节点i为树根的子树,节点i有儿子c1,c2,c3....cj共j棵子树。s[i]为树根为i的子树包含的节点数。如果分别先给各个子树内部排序,那么毫无疑问,共有f(c1)*f(c2)*f(c3)....*f(原创 2015-02-19 17:32:57 · 1254 阅读 · 0 评论 -
UVa CD 0-1背包且打印路径
就是简单的0-1背包问题,不过没有具体的效益值,隐含的效益值就是剩余背包的容量。因为要输出具体选择了那些track(也就是物品),所以采用序偶的方法。其实0-1背包的解画在坐标轴上就是一个分段函数,所谓序偶就是那些跃迁的节点。但是这道题略有不同,第0阶段的初始序偶不是(0,0),而是(0,N)。序偶的第一个参数表示容量,第二个参数表示背包的剩余容量。当由前一阶段的序偶得到新序偶,并且将两者合并的时原创 2015-02-08 21:26:00 · 815 阅读 · 0 评论 -
UVa 10131 Is Bigger Smarter?
开始觉得这道题果断是用LCS解的,因为只要把大象的编号分别按照体重从小到大排序获得序列一,然后再将原始编号按照智商从大到小排序获得序列二。然后两个序列求最长子序列即可。但是后来发现这样做有问题,题目中要求所得子序列的体重或是智商都是严格单调的。解决方法其实也简单,只要在编号匹配的情况下,智商和体重都和前一个已经匹配的大象不一样就可以了。不过.....这种方法始终wrong answer。我想可能是原创 2015-02-07 10:39:32 · 864 阅读 · 0 评论 -
UVa 116 Unidirectional TSP
这道题是非常基础的动态规划,类似于分阶段决策。题意是:一个M*N的数组,要求从第1列走到第N列且下一步的位置都只能是当前位置的相邻右侧,相邻右上,相邻右下三个位置。要求路径上的格子内的数字和最小。若有和相同的路径,则输出字典序最小的那一条路径。解法其实就是设置一个记忆数组,分阶段决策即可。 但是决策有从左往右和从右往左两种方式。开始我使用的从左往右的方式,这稍微麻烦一点,因为这需原创 2015-02-06 14:44:13 · 811 阅读 · 0 评论 -
UVa Placing Lampposts 树型DP
大致思路和大白书上的相同,不过感觉书上的决策部分讲解的并不是非常清楚,因此我在这里讲解一下我的决策思路。 首先,d(i,j)表示根节点为i的子树,当它的父节点为j(j=0或1)时的x的最小值(x的含义书上有讲解),要将该子树根节点和父节点相连的边的情况计算在内。接下来遍历森林中的每一棵树,对于每一棵树的根节点进行特别的处理,然后就对该树进行深度优先搜索dfs(i)。原创 2015-04-07 21:31:34 · 734 阅读 · 0 评论