上一页 1 ··· 9 10 11 12 13 14 15 16 17 ··· 25 下一页
摘要: 求一个序列中 的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,原来不是,是要二分的那个位置才是。。。。还有就是二分一开始调 阅读全文
posted @ 2014-03-20 19:16 KRisen 阅读(216) 评论(0) 推荐(0) 编辑
摘要: 一开始把它当成暴力来做了,即,从终点开始,枚举其最长的回文串,一旦是最长的,马上就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]; } ... 阅读全文
posted @ 2014-03-20 15:05 KRisen 阅读(312) 评论(0) 推荐(0) 编辑
摘要: 这个题目上周的对抗赛的,美国2013区域赛的题目,上次比赛真惨,就做出一道题,最多的也只做出两道,当时想把这题做出来,一直TLE。这个题目用挂在Hunnu OJ的数据可以过,但UVALive上死活过不了,好像UVALive卡的时间不太对,没人过了这道题。我当初是想用一个dp[s]表示键入状态,然后由dp[0]开始逐渐向上深搜,结果就TLE了,后来比较了一下别人的代码,,果然我这样还是不行不管我怎么优化,我这一维数组,不能对某个状态马上就返回,因为随时可以再被更新,但是如果用个二维数组,dp[s][i],表示在状态为s的时候,键入第i个字符时候的最小键入数目,就可以只更新一次,下次再遇到这个情况 阅读全文
posted @ 2014-03-19 15:56 KRisen 阅读(241) 评论(0) 推荐(0) 编辑
摘要: 这个题目是个挺难表示的状态DP,因为不但要考虑上下还要考虑左右,在DP里面就没有什么下了咯,但也至少除了考虑左右还要考虑上所以先枚举出在同一行满足条件的状态 即 某状态 若 s&(s#include #include #include #define N 11using namespace std;int dp[105][1<<N-3][1<<N-3];int A[105],m,n,calc[1<<N],num,state[1<<N];void init(){ num=0; for (int i=0;i<(1<<m);i 阅读全文
posted @ 2014-03-17 21:22 KRisen 阅读(179) 评论(0) 推荐(0) 编辑
摘要: 这个题目搁置了这么久,终于搞完了。给n个人分配n个课程,已经告诉了你n个人对哪几门感兴趣,问最多有多少种分配方式我刚开始都没找到这怎么还可以状态dp,哪来的状态转移,想用暴力DFS,果断TLE的妥妥的。后来给殷犇发了这个题目,他还说你刷个这水题还刷得这包子劲,这题目就是后一行的状态由前一行得到,枚举当前这一行分配的状态,如果可行,就从后面的状态加过来由于状态只是从上一行转移过来,所以可以用滚动数组,用p表示当前,则!p就为上一行的,每次结束再把p置反即可。#include #include #include #define ll long longusing namespace std;int 阅读全文
posted @ 2014-03-17 11:18 KRisen 阅读(233) 评论(0) 推荐(0) 编辑
摘要: 这个题目搞了我差不多一个下午,之前自己推出一个公式,即 f[n+k]=k*f[n]+f[n-1]结果发现根本不能用,无法降低复杂度。后来又个博客的做法相当叼,就按他的做法来了即 最终求得是 S(n)=f[b]+f[b+k]+f[b+2*k]....f[b+n*k] (原题的意思好像是不用加到第n项,但实测确实要加到该项)然后我们令 A={1,1}(标准的斐波那契矩阵) {1,0}发现 f[b]=A^b,f[b+k]=A^(b+k),....f[b+nk]=A^(b+nk);提取公共因子 A^b.S(n)=A^b*(E+A^K+A^K^2....A^K^n)再令K=A^K (K... 阅读全文
posted @ 2014-03-15 21:09 KRisen 阅读(366) 评论(0) 推荐(0) 编辑
摘要: 这个题目上周对抗赛题目,搞了我好久 对数学这种不是很敏感其实都不是自己想出来的,看其他的资料和博客的推导 还是有点难度的,反正我是推不出来通过二项式定理的化简有两个博客写得比较好http://972169909-qq-com.iteye.com/blog/1863402http://www.cppblog.com/Yuan/archive/2010/08/13/123268.html反正构造好二项式之后,乘N次,就可以得到结果了,因为右边的式子 初始全部是x。#include #include #include #define ll __int64using namespace std;con 阅读全文
posted @ 2014-03-15 11:33 KRisen 阅读(386) 评论(0) 推荐(0) 编辑
摘要: 因为最近学了Splay,刚看到这个题目总共四种操作,把某个数移到另一个数的左边 或者右边 交换两个数 翻转整个序列,马上想到用Splay,因为总点数和总操作数都为10^5,如果用Splay把操作优化到logN级别,应该是可以再1sec过得。于是我就好心急的在那里敲Splay,敲着敲着就发现不对劲了,题目要求的把x移到y的左边或者右边 或者交换x和y的值,不是指序列的第x位和y位,而是就直接指数值为x和y的那两个数。所以Splay根本就不适用所以还是回到链表来,其实用链表也挺简单的,一开始我还想复杂了,每个x和y就固定对应自己的节点x,y,进行4个操作的时候,前三个,只要把节点x和节点y连起来或 阅读全文
posted @ 2014-03-14 11:20 KRisen 阅读(494) 评论(0) 推荐(0) 编辑
摘要: 必须要批评下自己了,首先就是这个题目的迟疑不定,去年做字典树的时候就碰到这个题目了,当时没什么好的想法,就暂时搁置了,其实想法应该有很多,只是居然没想到。同样都是对单词进行建树,并插入可能值,但是拨号键盘上的字母是对应多个的,给定拨号序列,有多种可能情况 输出其中最可能的一种,肯定要想到搜索啊,而且拨号数目不超过100,每个按键最多只对应4个字母,复杂度并不高,所以用dfs是可行的,对于每次递归深度,dfs找到最大的可能值的情况并输出。接下来就是要批评自己了,下午一点钟开始做这个题目,居然被一个小bug搞了一个多小时,都没过样例,就是我的dfs写挫了,而且我迟迟没找到原因。。。真的要反省自己的 阅读全文
posted @ 2014-03-13 20:25 KRisen 阅读(378) 评论(0) 推荐(0) 编辑
摘要: 其实主要是想学一下字典树的写法,但这个题目又涉及到了DP;这个题目要求某些单词组成一个长子串的各种组合总数,数据量大,单纯枚举复杂度高,首先肯定是要把各个单词给建成字典树,但是之后该怎么推一时没想到。其实就是通过递推,从1扫到最后一位,由d[i]代表1-i位的时候的组合总数,则对d[i]进行扩张,凡是可以从第i+1位到第j位正好对应一个单词,则,d[j]+=d[i];这样递推完,d[len]即为最后结果为了表示某个单词的结尾,在字典树中再加一个变量 flag,当单词结尾的时候为1,否则为0,这样只要在树种读到了flag=1的时候,即表示读到这个单词。#include #include #inc 阅读全文
posted @ 2014-03-12 21:51 KRisen 阅读(378) 评论(0) 推荐(0) 编辑
上一页 1 ··· 9 10 11 12 13 14 15 16 17 ··· 25 下一页