随笔分类 - UVA
摘要:第一次接触一个这最长公共上升子序列不过其实搞清楚了跟最长公共子序列和 最长上升子序列如出一辙两重循环,对于当前不相等的,等于前一个的值,相等的,等于比当前A【i】小的最大值+1。弄个临时变量记录最大值即可#include #include #include #include using namesp...
阅读全文
摘要:前年的省赛题,难点在于这个石头的推移不太好处理后来还是看了阳神当年的省赛总结,发现这个石头这里,因为就四五个子,就暴力dfs处理即可。先把石头当做普通障碍,进行一遍全图的dfs或者bfs,找到可以找的点,然后dfs每次探索新区域的新点即可,想通了这里很好做了#include #include #in...
阅读全文
摘要:题意很简单,给定一个N*N的大矩阵,求其中数值和最大的子矩阵。一开始找不到怎么DP,没有最优子结构啊,后来聪哥给了我思路,化成一维,变成最大连续和即可。为了转化成一维,必须枚举子矩阵的宽度,通过预处理的suffix可以很快计算出每一列某一段的和,然后进行一维DP即可。。总复杂度为 O(N^3);#i...
阅读全文
摘要:我们知道1——k有K!种排列,现在给定k和n,要你按字典序输出 第n种排列的数列而且题目给的 n是 n=S1(k-1)!+S2(k-2)!+...+Sk-1*1!+Sk*0!(0=#include #include #include #define N 50000+10using namespace...
阅读全文
摘要:这个题目蛮有新意的,一度导致我没看透他是区间DP给一个0-L长度的木板,然后给N个数,表示0-L之间的某个刻度,最后要用刀把每个刻度都切一下 使其断开,然后每次分裂的cost是分裂前的木板的长度。求整个分开之后的最小cost。当时下意识就想到类似花瓶插花问题,即dp[i][j],表示第i个事物放在第...
阅读全文
摘要:这个题目要求和 还有 设置区间值 区间增值,明显要用线段树来由于行数不超过20 而列数多达 10^5,所以对每一行建一棵线段树。然后主要是在懒惰标记方面是难点 针对两种操作 分别设置 set 和 add 方法,但是优先级方面要好好考虑可能出现的结果无非是 单独的 set 或者 add 以及 先set...
阅读全文
摘要:给出K*K的矩阵,每一行取一个数,构成K个数的和,总共有 k^k种可能,从中取出前k个最小的。一开始犯了错,因为只要对每行排序,最小的必定是第一列的和,然后我当时就想着,逐步推进,每次将某行的那个数变成其下一列那个数,当然间距要最小。我这样明显是不对的,这样的话每个数只用了一次,而题目的意思明显是可...
阅读全文
摘要:上次的湘潭赛的C题,用线段树敲了下还是WA,不知道为何,我已经注意了处理相同数据,然后他们当时用的RMQ。所以学了下RMQ,感觉算法思想是一样的,RMQ用了DP或者是递推,由单个数到2^k往上推,虽然有部分重叠的,也没关系,因为RMQ是求区间最值嘛然后这道题目,要把出现次数化为最值,构造一个新的数组...
阅读全文
摘要:题意比较简单,给你n个项链碎片,每个碎片的两半各有一种颜色,最后要把这n个碎片串成一个项链,要求就是相邻碎片必须是同种颜色挨着。看了下碎片总共有1000个,颜色有50种,瞬间觉得普通方法是无法在可控时间内做出来的,因为碎片到底放哪里以及是正着放还是反着放都是不可控的。这个时候数学建模就真的好重要了,...
阅读全文
摘要:很少用bfs进行最短路搜索,实际BFS有时候挺方便得,省去了建图以及复杂度也降低了O(N*M);UVA 11624 写的比较挫#include #include #include #include using namespace std;struct node{ int ft; int ...
阅读全文
摘要:好印象深刻的题,前天选拔赛给跪了。怪我这种关键题没敲出来。题意很简单,给你一串无规则的数列,再给个m值,求出满足 数列和>=m的长度最小的连续子串。。。确实一开始卡住了,因为看数据肯定是nlogn的算法才能过,我和聪哥坐在外面的楼梯上,想了各种方法,我就一直在想前缀和以及 先求出最长连续和 再两边删...
阅读全文
摘要:这个题目要求在一个大矩阵里面匹配一个小矩阵,是AC自动机的灵活应用思路是逐行按普通AC自动机匹配,用过counts[i][j]记录一下T字符矩阵以i行j列为开头的与P等大的矩阵区域 有多少行已经匹配了,显然如果该数值==p的行数,则说明匹配成功就是在自动机的过程中,匹配得时候要稍微多想一下,每次匹配...
阅读全文
摘要:首先我们应该是枚举 L个位置上的每个字符来得到最终概率然后AC自动机的作用就是为了判断你枚举的地方是否对应了单词节点,如果对应了,就肯定要不得#include #include #include #include #include using namespace std;const int max_...
阅读全文
摘要:因为字符集比较大,所以就不能用简单字典树,在字典树里面,用链表进行存储。这个倒是不难,练了下手统计的时候还是有点难搞,因为要算所有的两两比较的次数之和,对分叉处进行计算,注意细节#include #include #include using namespace std;const int N = ...
阅读全文
摘要:求火柴的组成的数字最多能组成多少种数字,典型的递推问题但是因为结果巨大,要用高精度运算一开始手写高精度,不仅挫的要死,最后还WA了。最后学了一下白书上面的bign类,相当方便啊。#include #include #include #include #include #define N 720using namespace std;struct bign{ int len,s[N]; bign() { memset(s,0,sizeof s); len=1; } bign(int num) {*this=num;} string ...
阅读全文
摘要:这个题目求某个字符串中含的最长的回文子串。就是一个很简单的LCS模型吗,而且我不明白为什么网上这么多人都说仿照某写法把字符串先逆序一下,然后求LCS,我只想问一下,有必要吗?直接按LCS的套路来就行了啊,只不过方式变了下,按上面的写法,又麻烦,又根本没利用的LCS的精髓思想即,先从间隔0位开始做起,然后是间隔1位。。2.。。n-1位,d[i][j]代表i到j的最长回文串个数于是就有 s[i]==s[j] d[i][j]=d[i+1][j-1]+2,否则就取 max(f[i+1][j],f[i][j-1]),不就行啦。还用得着上面那样搞?不过如果这个问题这么简单我也不会放到博客里来写了。主要是下
阅读全文
摘要:这个题目刚看到还真不好下手,把一个是 k的倍数的长度的字符串分成len/k块,每块是k个字母,每个块可以重新组合,最后使得整个序列的相同字母尽量在一起,也就是说,最后会把序列从前往后扫,相连的相同字母算一个块,最后使得所有块最少。这个其实是个从前往后扫的问题,只要枚举最后一位是哪个,比如i-1块的最后一位是w,且w在第i块中确实有,则 f[i][j]=min(本身,f[i-1][w]+chunks[i]-1), chunks[i]表示该块有本身有多少个小块。#include #include #include #define INF 1<<30char ch[1010];int r
阅读全文
摘要:求一个序列中 的2*n-1个数字 ,前n+1个数字为严格升序 后n+1个为严格降序,求最长的长度一开始还没想清楚怎么解,其实就是一个LCS问题,从头到尾以及反序求一下LCS由于 d[i]为包含了自身的LCS,所以每次比较 min(d1[i],d2[i]),再 2*min-1即可,d1和d2分别为正序和反序的LCS。由于时间卡的紧,要用之前学过的压栈法求LCS,时间复杂度为n*logn,中间出了一些问题,首先就是保存每个节点的LCS值的时候,如果该点是大于sta[top],那自然LCS为top+1,但是如果不是的话,我一开始写成top,原来不是,是要二分的那个位置才是。。。。还有就是二分一开始调
阅读全文
摘要:一开始把它当成暴力来做了,即,从终点开始,枚举其最长的回文串,一旦是最长的,马上就ans++,再计算另外的部分。。。结果WA了事实证明就是一个简单DP,算出两个两个点组成的线段是否为回文,再用LCS的类似做法得到每个子结构的最优值。#include #include #define N 1010char s[N];int n,len,d[N][N],sum[N];int min(int a,int b){ if (a0) { tmp=1+sum[j-1]; } ...
阅读全文
摘要:因为最近学了Splay,刚看到这个题目总共四种操作,把某个数移到另一个数的左边 或者右边 交换两个数 翻转整个序列,马上想到用Splay,因为总点数和总操作数都为10^5,如果用Splay把操作优化到logN级别,应该是可以再1sec过得。于是我就好心急的在那里敲Splay,敲着敲着就发现不对劲了,题目要求的把x移到y的左边或者右边 或者交换x和y的值,不是指序列的第x位和y位,而是就直接指数值为x和y的那两个数。所以Splay根本就不适用所以还是回到链表来,其实用链表也挺简单的,一开始我还想复杂了,每个x和y就固定对应自己的节点x,y,进行4个操作的时候,前三个,只要把节点x和节点y连起来或
阅读全文

浙公网安备 33010602011771号