随笔分类 - 3_算法和数据结构
摘要:算法注意 5、动态规划填表的时候,对于能够填表的点才填表 一、总结 一句话总结: 动态规划填表的时候,对于能够填表的点才填表,不能填表的点比如初始状态就不能动(比如过河卒) 1、f(n)=f(n-1)+f(n-2)+...+f(n-k)在写成代码的注意点是什么? 这里的第一层循环i代表n,第二层循环
阅读全文
摘要:算法注意 4、解决算法bug的一条思路(除了日志,二分法查bug) 一、总结 一句话总结: 遇到代码bug,打印前几百个结果,一下子就知道错在哪了,比如高精度做斐波那契数列 1、memset(f,-1, sizeof(f));? memset的sizeof在最后,要设置的值在中间 2、memset的
阅读全文
摘要:算法与数据结构 8.4、过河卒-递推解法取正 一、总结 一句话总结: 过河卒递推解法取正就是将过河卒递推表达式中负数的情况转化成正数的情况,将整个图右下移2,也就是将每个点的横纵坐标加2,这样就转换成全是正数的情况了 #include <iostream> #include <cstring> us
阅读全文
摘要:算法与数据结构 8.3、过河卒-递推解法 一、总结 一句话总结: 过河卒的递推解法我们选用动态规划,动态规划就是保存中间状态的递推解法,这题递推表达式非常明确,所以动态规划做起来也非常容易 1 /* 2 3 状态: 4 如果设f[i][j]表示走到(i,j)点的路径总数 5 6 递推表达式(状态转移
阅读全文
摘要:算法与数据结构 8.2、过河卒-搜索解法取正 一、总结 一句话总结: 过河卒搜索解法取正就是将过河卒递推表达式中负数的情况转化成正数的情况,可以通过给图上的每个点加上一个数来实现,这样就少了很多负数的判断,并且对结果也没有影响 1 #include <iostream> 2 #include <cs
阅读全文
摘要:算法与数据结构 8.1、过河卒-搜索解法 一、总结 一句话总结: 过河卒搜索的解法可以先思考没有马的简单情况,有马的情况,只是递归的终止条件从起点变成了起点或者马控制的区域 #include <iostream> #include <cstring> using namespace std; int
阅读全文
摘要:算法与数据结构 过河卒-递推(动态规划)写法常见易错点 一、总结 一句话总结: 对于有负数情况的递推(动态规划)问题,比如过河卒,f[i][j]=f[i-1][j]+f[i][j-1],采用的策略一般都是加数让它变成正数 1、直接填表更新状态会有问题,那些被马控制的点不能被更新状态,始终要是0? |
阅读全文
摘要:算法与数据结构 过河卒-搜索(递归)写法常见易错点 一、总结 一句话总结: f[i][j]=f[i-1][j]+f[i][j-1]这样的递推表达式,取数之前一定要保证数是存在的 1、表示马的控制点如何表示? int hx[9]={0,-2,-1,1,2,2,1,-1,-2}; int hy[9]={
阅读全文
摘要:算法与数据结构 7.3、进阶跳台阶 一、总结 一句话总结: A、对于这些递推规律一眼看不出的问题,我们可以枚举前几项来找规律, B、本题(进阶跳台阶)中,我们枚举前几项之后,轻松发现数字规律f(n)=2^(n-1),递推表达式f(n)=f(n-1)+f(n-2)+...+f(1)+1 #includ
阅读全文
摘要:算法与数据结构 7.4、变态跳台阶 一、总结 一句话总结: 1、变态跳台阶的问题有了之前跳台阶和进阶跳台阶的问题做铺垫,递推表达式非常好想:f(n)=f(n-1)+f(n-2)+...+f(n-k), 2、根据f(n)=f(n-1)+f(n-2)+...+f(n-k),所以我们需要知道前k项,从而确
阅读全文
摘要:算法与数据结构 7.2、跳台阶-高精度加法 一、总结 一句话总结: a、这个跳台阶的问题里面没有取模,n大概40多的时候结果就超过int了,而本题n等于5000,所以要用高精度, b、而因为递推关系式f(n)=f(n-1)+f(n-2)里面是加法,所以用高精度加法 1 #include <iostr
阅读全文
摘要:算法与数据结构 7.1、跳台阶 一、总结 一句话总结: 跳台阶的问题,枚举前几项之后,就找到规律f(n)=f(n-1)+f(n-2),也就是斐波那契数列 #include <iostream> #include <cstring> #include <algorithm> using namespa
阅读全文
摘要:算法疑难(c++实现) 3、高精度加法 一、总结 一句话总结: A、高精度加法的原理就是小学学的竖式加法的操作,只是编程实现而已,输入的话,就用字符串 B、但是计算的时候,我们可以用数组,数组中的每一位存储一个数字,相加就逐位相加,然后进位就好 #include <iostream> #includ
阅读全文
摘要:算法与数据结构 6.8、斐波那契数列-矩阵快速幂 一、总结 一句话总结: 斐波那契数列的矩阵快速幂的解法,也就是将递推表达式化成矩阵的幂操作和乘法操作,利用快速幂,可以得到O(logn)的解法 1 #include <iostream> 2 #include <cstring> 3 using na
阅读全文
摘要:bug调试 1、斐波那契数列的矩阵快速幂解法bug 一、总结 一句话总结: 发现问题出在矩阵的快速幂里面,因为函数传n过去的时候指定的是int,而本题的n<2^63,所以n本来应该是long long类型的 错误原因:这里的n传参写成了int //矩阵的快速幂 //这里的n写成int类型有问题,这里
阅读全文
摘要:算法疑难(c++实现) 2、矩阵乘法 一、总结 一句话总结: 矩阵乘法就是按照矩阵相乘的规律,一步步来做的,也就是拿矩阵a的每一行乘以矩阵b的每一列,并且把矩阵a的每一行里面的每一个元素都和矩阵b里面每一列的每一个元素都一一相乘 Matrix multiply(Matrix a,Matrix b){
阅读全文
摘要:算法疑难(c++实现) 1、快速幂 一、总结 一句话总结: 比如在求a^11的时候,快速幂就是利用11的二进制1011,也即11=2º×1+2¹×1+2²×0+2³×1=1+2+8,将a^11转化为a^1*a^2*a^8,从而用O(logn)的时间复杂度求解 #include <iostream>
阅读全文
摘要:快速幂 一、总结 一句话总结: a^11=a^(2^0+2^1+2^3),我们将a¹¹转化为算 a2^0*a2^1*a2^3,原来算11次,现在算三次 a^11=a^(2^0+2^1+2^3),11的二进制是1011,11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1,因此,我们将a¹¹转
阅读全文
摘要:算法与数据结构 6.7、递推和递归的关系 一、总结 一句话总结: 递归元素之间的关系式就是递推表达式,或者说递推可以用递归来实现,当然递推也可以不用递归来实现,比如用普通循环来实现 1、递推和递归主要作用分别是什么? 递推主要指是找规律来找到递推表达式,从而求解问题,是一种解决问题的方式 递归主要指
阅读全文
摘要:算法与数据结构 6.6、斐波那契数列-记忆化递归 一、总结 一句话总结: 记忆化递归,就是把已经计算的中间状态保存下来,下次需要的时候就直接拿这个结果,就避免了递归中的重复计算中间状态 #include <iostream> #include <cstring> using namespace st
阅读全文