按照递推的思想求解next[]数组】的更多相关文章

按照递推的思想求解next[]数组 根据定义next[0]=-1,假设next[j]=k, 即P[0...k-1]==P[j-k,j-1] 若P[j]P[k],则有P[0..k]P[j-k,j],很显然,next[j+1]=next[j]+1=k+1; 若P[j]!=P[k],则可以把其看做模式匹配的问题,即匹配失败的时候,k值如何移动,显然k=next[k]. 因此可以这样去实现: void getNext(char *p,int *next) { int j,k; next[0]=-1; j…
这里所有的内容都将有关于一个线性递推: $f_{n} = \sum\limits_{i = 1}^{k} a_{i} * f_{n - i}$,其中$f_{0}, f_{1}, ... , f_{k - 1}$是已知的. BM是用于求解线性递推式的工具,传入一个序列,会返回一个合法的线性递推式,一个$vector$,其中第$i$项表示上式的$a_{i + 1}$. CH用于快速求解常系数齐次线性递推的第$n$项,我们先会求出一个特征多项式$g$,$g$的第$k$项是$1$,其余项中第$k - i…
最近做到好多概率,组合数,全排列的题目,本咸鱼不会啊,我概率论都挂科了... 这个题学到了一个康托展开,有点用,瞎写一下... 康托展开: 适用对象:没有重复元素的全排列. 把一个整数X展开成如下形式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[2]*1!+a[1]*0![1] 其中a[i]为当前未出现的元素中是排在第几个(从0开始),并且0<=a[i]<i(1<=i<=n) 用来求全排列中这个串排第几,康托展开的逆运算就是…
一.题目链接:P1064 金明的预算方案 二.思路 1.一共只有五种情况 @1.不买 @2.只买主件 @3.买主件和附件1(如果不存在附件也要运算,只是这时附件的数据是0,也就是算了对标准的结果也没影响) @4.买主件和附件2 @5.买主件和两个附件 2.因为要求的是重要度*价格,那么数组就直接存重要度*价格,最后输出f[n]就是答案 附件不一定刚好有两个,可是如果没有的话数组的值是空的,也就好像虚无缥缈的灵魂一样,用了也没关系 3.主件和附件要构建一层联系,一个个输入物品时肯定混杂着主件和附件…
题意:初始1个红气球,每小时后,1个红气球会变成3个红气球和1个蓝气球,而1个蓝气球会变成4个蓝气球.问经过N小时后,第L~R行一共有多少个红气球. 解法:问行数就定义f[i][j]表示 i 小时后前 j 行的红气球数.分情况讨论后就可得出递推方程. 注意--1.数组开不小就时间换空间,递归替代递推求解:2.要另外定义一个c函数,c(i)表示f[i][1<<i],否则每次都至少要算2^i,会TLE. 1 #include<cstdio> 2 #include<cstdlib&…
链接: https://www.nowcoder.com/discuss/84119 题意: 给定n个箱子, 每个箱子打开发现钻石的概率P(这里的P要除100), 每个钻石的重量, 有一个人只能持有一个钻石, 每次打开箱子发现手中的钻石小于箱子的钻石, 他就会换掉手中的钻石, 求交换次数的数学期望 分析: 对于一个箱子, 取里面钻石的概率就是(P * (之前不打开比它重的概率)), 那么从最重的钻石开始递推, 用树状数组统计(之前不打开)的概率, 然后把这个点设为不打开. 树状数组一开始初始化为…
传送门 不会莫比乌斯反演,不会递推. 但是我会看题解. 先将区间[L,H]变成(L-1,H],这样方便处理 然后求这个区间内gcd为k的方案数 就是求区间((L-1)/k,H/k]中gcd为1的方案数 有个重要的性质:如果有一些不相同的数,最大的为a,最小的为b,任意选取其中的一些数,则他们的gcd<=a-b 设f[i]表示gcd为i且所选的数不相同的方案数,但是不好求,只容易求出gcd为i的倍数g[i]的方案数 考虑容斥原理,f[i] = g[i] - f[2i] - f[3i] - …… 计…
Problem Description Eddy是个ACMer,他不仅喜欢做ACM题,而且对于Ranklist中每个人的ac数量也有一定的研究,他在无聊时经常在纸上把Ranklist上每个人的ac题目的数量摘录下来,然后从中选择一部分人(或者全部)按照ac的数量分成两组进行比较,他想使第一组中的最小ac数大于第二组中的最大ac数,但是这样的情况会有很多,聪明的你知道这样的情况有多少种吗? 特别说明:为了问题的简化,我们这里假设摘录下的人数为n人,而且每个人ac的数量不会相等,最后结果在64位整数…
The Nth Item \[ Time Limit: 1000 ms \quad Memory Limit: 262144 kB \] 题意 给出递推式,求解每次 \(F[n]\) 的值,输出所有 \(F[n]\) 的 \(xor\) 值. 思路 对于线性递推数列,可以用特征方程求出他的通项公式,比如这题 \[ F[n] = 3F[n-1]+2F[n-2] \\ x^2 = 3x+2 \\ x = \frac{3\pm \sqrt{17}}{2} \] 令 \(F[n] = C_1x_1^n…
题意:从编号为 1~N 的音阶中可选任意个数组成一个音乐片段,再集合组成音乐篇章.要求一个音乐篇章中的片段不可重复,都不为空,且出现的音符的次数都是偶数个.问组成 M 个片段的音乐篇章有多少种.答案取模1000000007(质数). 解法:先将题目模型化:N 个数组成 M 种组合,且要求组合之间互不相等,把各组合用二进制表示对 N 个数的取舍状态之后的异或和为0.   虽然求得是组合,但我们转化为排列来做计算时更方便.假设 f[i] 表示从 n 个数中选 i 种排列的方案数.那么就是"总的排列数…
题记:在求最大最小值的类似题目中,递推思想的奇妙之处,在于递推过程也就是比较求值的过程,从而做到一次遍历得到结果. LeetCode 上面的这三道题最能展现递推思想的美丽之处了. 题1 Best Time to Buy and Sell Stock Say you have an array for which the ith element is the price of a given stock on day i. If you were only permitted to complet…
题目链接:http://acm.uestc.edu.cn/#/problem/show/1217 题目大意就是求一个序列里面长度为m的递增子序列的个数. 首先可以列出一个递推式p(len, i) = sum(p(len-1, j)) (a[j] < a[i]) p(len, i)表示以第i个结尾的长度为len的子序列的个数. 但是如果按照递增子序列的思想,然后直接弄的话,复杂度是n*m*n的. 如果需要优化的话,可以优化的地方就是那个求sum的过程. 把p数组映射到树状数组,那么求和的过程就能在…
http://acm.hdu.edu.cn/showproblem.php?pid=6129 [题意] 对于一个长度为n的序列a,我们可以计算b[i]=a1^a2^......^ai,这样得到序列b 重复这样的操作m次,每次都是从上次求出的序列a得到一个新序列b 给定初始的序列,求重复m次操作后得到的序列 [方法一] 假定n=5,我们模拟一次可以发现,经过m次操作后a1在b1......bn中出现的次数为: m=0: 1 0 0 0 0 m=2: 1 2 3 4 5 m=3: 1 3 6 10…
题目链接:P1006 传纸条 PS:伤心,又想不出来,看了大神的题解 AC代码: #include<bits/stdc++.h> #define ll long long using namespace std; ll n,m,f[][],a[][]; int main() { ll i,j,k; cin>>n>>m; ;i<=n;++i) ;j<=m;++j) cin>>a[i][j]; f[][]=a[][]+a[][];//不管怎样都会经过…
概述 系数为常数,递推项系数均为一次的,形如下面形式的递推式,称为线性递推方程. \[f[n]=\begin{cases} C &n\in Value\\ a_1 f[n-1]+a_2 f[n-2]+⋯a_t f[n-t]&n∉Value \end{cases}\] \((a_1,a_2,-,a_t,C∈\mathbb{R},0<t<n)\) 其中\(Value\)为终止条件的集合. 例如:斐波那契\((Fibonacci)\)数列则通过下面这个线性递推方程定义 \[f[n]=…
条件语句 开关控制语句(SWITCH语句) 象坐电梯一样,break是按的楼层,不加break则会一直执行下去. 上面程序有细节BUG,边界测试输入-5,105时由于整除会得到错误的结果. 解决方法: 循环 当型循环与直到型循环的差别在于第一次执行时条件是否为真 关于逗号运算符   递推  又分正向递推和反向递推 #include<stdio.h> int main() { int x,n; n=; x=; )//需要递推9次 { x=*(x+); n++; } printf("x=…
原题链接:http://poj.org/problem?id=1664 思路:苹果m个,盘子n个.假设 f ( m , n ) 代表 m 个苹果,n个盘子有 f ( m , n ) 种放法. 根据 n 和 m 的关系可以进一步分析: 特殊的 n = 1 || m = 1 || n = 0 时只有一种方法 当 m < n时,即使苹果每个盘子放一个也没法放满所有盘子,题目允许有的盘子空着不放,所以我们可以将空盘子去掉,即 f ( m , n ) = f ( m , m ) 当 m >= n时,这时…
同步发表于我的洛谷博客. NOIP2013提高问题求解2: 现有一只青蛙,初始时在n号荷叶上.当它某一时刻在k号荷叶上时,下一时刻将等概率地随机跳到1,2,--,k号荷叶之一上,直到跳到第1号荷叶为止.当n=2时,平均一共跳2次,n=3时,平均一共跳2.5次.当n等于5时,平均一共跳几次. 先将问题转为青蛙随机跳了一步以后的情况,分为5种情况,分别是落在1号.2号.3号.4号.5号荷叶上.每种情况发生的概率为1/5. 然后设f(n)为n片荷叶所需的平均次数.显然,f(1)=1. 先从简单的考虑:…
动态规划的核心就是状态和状态转移方程. 对于该题,需要用抽象的方法思考,把当前的位置(i,j)看成一个状态,然后定义状态的指标函数d(i,j)为从格子出发时能得到的最大和(包括格子本身的值). 在这个状态定义下,原问题的解就是d(i,j). 下面看一下不同状态之间如何转移.从格子(i,j)出发有两种策略.如果向左走,则到(i+1,j)后需要求"从(i+1,j)出发能得到的最大和"这一问题,即d(i+1,j). 类似的,往右走之后需要求解d(i+1,j+1).由于可以在这两个决策中自由选…
利用阶乘公式来计算组合式: 程序设计思想: 根据公式来计算组合数的大小,从键盘输入n,k的值,设计一个计算阶乘的大小,如果输入的数a为1或0,则直接return 1,否则运用递归,计算a-1的阶乘,直到a为1时,递归结束. 程序流程图: 程序源代码: public static void main(String args[]) { int n ,k,c; Scanner in=new Scanner(System.in); System.out.print("输入从n个数中选k个数中n,k的值:…
HDU 2089 不要62 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2089 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众.不吉利的数字为所有含有4或62的号码.例如:62315 73418 88914都属于不吉利号码.但是,6115…
这是在2016在长沙集训的第三天,一位学长讲解了“前缀和优化”这一技巧,并且他这一方法用的很6,个人觉得很有学习的必要. 这一技巧能使线性递推形DP的速度有着飞跃性的提升,从O(N2)优化到O(N)也不是不可能. 这一技巧的主要思想是使要加和的数据完全储存,并且在下一次计算中直接调用,所以你的对于DP当前项的查询无论是N还是logN,这一方法都能直接解决. 以一道题来作为我们的例子: openjudge9277    (cf 295D跟这题差不多,只是对比于这道题要加个高度,但不用优化) 分享出…
I. Interesting Integers 传送门 应该是叫思维题吧,反正敲一下脑壳才知道自己哪里写错了.要敢于暴力. 这个题的题意就是给你一个数,让你逆推出递推的最开始的两个数(假设一开始的两个数为x和y),而且要求x<=y. 通过找规律可以发现,这个题就是求解a*x+b*y=k这个方程的x和y的值,并且要x和y为最小满足条件的解.可以找规律出一个公式fi[i]*x+(fi[i-1]+fi[i])*y=n.因为不知道n具体是在第几步推出来的,所以for循环跑一遍预处理出来的斐波那契数列(存…
Description 今天西工大举办了一场比赛总共有m+n人,但是有m人比较懒没带电脑,另外的n个人带了电脑.不幸的是,今天机房的电脑全坏了只能用带的电脑,一台电脑最多两人公用,确保n>=m.但是大家来的时间不同,随机次序来机房,带电脑的人直接准备比赛而没带电脑的人需要向带电脑并还没和别人公用的人求助(当然会答应).但是,如果不存在带电脑并还没和别人公用的人,那他就要等了,等是很让人头疼的,这就不和谐了,当然假如没有这样的情况发生比赛是很和谐的. Input 输入多组数据,每组数据只有一行m(…
题目链接:P2347 砝码称重 参考题解:点击进入 纪念我第一道没理解题意的题 ''但不包括一个砝码也不用的情况'',这句话我看成了每个砝码起码放一个 然后就做不出来了 思路: 1.这题数据很小,1000,所以其实没必要把多重背包用二进制优化成01背包,直接一个个拆开就好了 2.建立数组f[2000],用来f[j]=1表示存在重量为j这种可能,f[j]=0则表示不存在这种可能 建立数组a[2000],用来把多重背包一个个拆开 比如说我们输入的是 0 0 那a就是{,} 数组f其实是用了"桶&qu…
所谓递推,是指从已知的初始条件出发,依据某种递推关系,逐次推出所要求的各中间结果及最后结果.其中初始条件或是问题本身已经给定,或是通过对问题的分析与化简后确定.关于递推的知识可以参阅本博客中随笔“递推(一):递推法的基本思想”. HDU 2044~2050这7道题是针对初学者进行递推学习的专项练习,下面给出它们的AC程序供参考. HDU 2044:一只小蜜蜂 不妨将图示的蜂箱结构看成从1--—2——-3——…的一个“W”型楼梯.蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行.可以等效地看成蜜蜂每次上楼…
[BZOJ4944][NOI2017]泳池(线性常系数齐次递推,动态规划) 首先恰好为\(k\)很不好算,变为至少或者至多计算然后考虑容斥. 如果是至少的话,我们依然很难处理最大面积这个东西.所以考虑答案至多为\(k\)的概率,再减去至多为\(k-1\)的概率就是最终的答案. 发现要求的东西必须贴着底边,所以对于每一列而言我们需要考虑的就是选定区间的最低的那个不安全的格子的行号,再乘上底边的长度. 所以考虑设\(f[n]\)表示底边长度为\(n\)的答案,即确定底边长度为\(n\)时,面积小于等…
题目描述 穿越了森林,前方有一座独木桥,连接着过往和未来(连接着上一题和下一题...). 这座桥无限长. 小 Q 在独木桥上彷徨了.他知道,他只剩下了 N 秒的时间,每一秒的时间里,他会向 左或向右移动一步. N 秒之后,小 Q 恰在桥上某一特定位置,且他每两次经过此位置的时间间隔不会超过 M 秒. 那么问题来了,这 N 秒的时间里,小 Q 的路线总共会有多少种可能的形式. 输入 文件第一行两个正整数 N.M,如题目所描述 输出 输出一个整数,表示可能的路线数量最终模 1000000007 的结…
引言 最近在刷leetcode算法题的时候,51题很有意思: 题目是这样的: n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击.给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案.每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位. 示例 1:输入:n = 4输出:[[".Q..","...Q","Q...","..Q.&q…
一.递推: 所谓递推,简单理解就是推导数列的通项公式.先举一个简单的例子(另一个NOI练习题,但不是这次要解的问题): 楼梯有n(100 > n > 0)阶台阶,上楼时可以一步上1阶,也可以一步上2阶,也可以一步上3阶,编程计算共有多少种不同的走法. 这个问题可以用递归来进行解决,但是解题时间1秒明显不够用.怎么办呢,可以考虑找到“规律”,然后推导公式解决问题,开始画图分析: 这是4个台阶时的全部7种走法,记作f(4)=7.现在观察右侧绿色走过的部分,1234四种情况是3个台阶时的4种走,法记…