随笔分类 - 3_算法和数据结构
摘要:算法与数据结构 6.5、斐波那契数列-递归解法 一、总结 一句话总结: 递推法的递推表达式就是递归的各个元素之间的关系,所以递推表达式明确之后,递归的代码也就特别好写了 #include <iostream> using namespace std; const int mod=1000000007
阅读全文
摘要:算法与数据结构 6.4、斐波那契数列-三个变量 一、总结 一句话总结: A、斐波那契数列的三个变量解法,我们将f[3]用3个变量a、b、c来代替,这个时候就不能通过取模(%3)来自动变换位置了 B、这个时候我们可以保留f(n)和f(n-1)来做下一轮的f(n-1)和f(n-2) #include <
阅读全文
摘要:算法与数据结构 6.3、递推和动态规划的关系 一、总结 一句话总结: 动态规划可以看做是一种特殊的递推,动态规划可以看做保存中间状态(中间结果)的递推 /* 上述代码也就是这个题目动态规划的写法 动态规划里面有状态,状态转移方程 递推里面初始值,递推表达式 其实动态规划里面的状态转移方程,就是递推表
阅读全文
摘要:算法与数据结构 6.2、斐波那契数列-滚动数组优化 一、总结 一句话总结: a、因为递推表达式f[i]=f[i-1]+f[i-2]中只用到了f[i]、f[i-1]和f[i-2]三个元素,所以可以用含有三个元素的数组来优化 b、滚动数组的代码修改也很简单,直接在递推表达式有i的位置%3即可,f[i%3
阅读全文
摘要:算法与数据结构 6.1、斐波那契数列-递推解法 一、总结 一句话总结: 波那契数列递推的关系式F(n)=F(n-1)+F(n-2)已经有了,所以明确一下循环的边界条件,递推的代码就很好敲了 #include <iostream> using namespace std; const int mod=
阅读全文
摘要:算法与数据结构 5、递推 一、总结 一句话总结: 递推算法就是对于一个问题,我们找到它数学对应的递推表达式,也就是相邻几项的关系。 递推算法就是对于一个问题,我们找到它数学对应的递推表达式, 也就是相邻几项的关系。 递推算法避开了求通项公式的麻烦,把一个复杂的问题的求解, 分解成了连续的若干步简单运
阅读全文
摘要:算法注意 3、分治的本质 一、总结 一句话总结: 分治本质上还是枚举,只是和普通枚举的枚举方向不同,仅此而已 1、为什么包含mid的序列,转化成求出区间[i..mid]的最大值与区间[mid+1..j]的最大值也可? 包含mid的子序列分为【包含mid且包含mid+1】和【包含mid且不包含mid+
阅读全文
摘要:算法与数据结构 4.9、最大子段和-dp空间优化 一、总结 一句话总结: 在最大字段和的动态规划的解法的代码中,我们发现用来做动态规划的数组f在代码中只用到了f[i]和f[i-1],所以我们可以用只有两个元素的滚动数组来优化f数组 /* 我们来看一眼代码: 代码中用到a数组位置除了a[1]这个固定的
阅读全文
摘要:算法与数据结构 4.8、最大子段和-贪心和dp区别 一、总结 一句话总结: A、最大字段和的贪心解法就是只考虑当前对于a[i]最优的情况,是选择s[i-1]还是不选择s[i-1]来得到局部最优解 B、最大字段和的动态规划解法就是在全局统筹的基础上,找到规律,通过规律设置好状态,找到状态转移的方程 二
阅读全文
摘要:算法与数据结构 4.7、最大子段和-动态规划 一、总结 一句话总结: a、最大子段和有对应的动态规划的解法,找到题目的规律, b、根据规律设置状态f[i]表示以第i个元素结尾的子序列的最大值, c、那么状态转移方程为f[i]=max(f[i-1]+a[i],a[i]) (2<=i<=n) #incl
阅读全文
摘要:算法与数据结构 4.6、最大子段和-贪心优化 一、总结 一句话总结: 1、时间方面优化:循环可以合并(循环方向一致,循环最大值也是,并且两个循环之间没有什么逻辑操作代码) 2、空间方面优化:代码中只用到了a[i],所以a[]数组可以用一个变量来代替 #include <iostream> #incl
阅读全文
摘要:算法与数据结构 4.5、最大子段和-贪心解法 一、总结 一句话总结: 贪心求解最大连续子序列的和,其实贪心得到的局部最优解是所有以a[i]结尾的子序列和最大的s[i],在s[i]中找最大的就是全局最优解,时间复杂度为O(n) 算法步骤: 1、找到以a[i-1]结尾的连续非空子序列中和最大s[i-1]
阅读全文
摘要:算法注意 2、遇到算法里面一些不懂的代码怎么办 一、总结 一句话总结: 代码有疑问的位置,带点实例在程序里面debug一下,代码每句的意思就异常清楚了 1、枚举法的核心关键? 对于枚举法,弄清楚枚举变量、枚举范围、枚举判断条件之后,代码非常好写,结合算法思路,的确非常棒 2、枚举非空数字连续子段的时
阅读全文
摘要:算法注意 1、取用数据之前一定要保证数据存在 一、总结 一句话总结: 动态规划中,f[j]=f[j] + f[j-w[i]]结构,肯定要保证j-w[i]>=0,也就是取数据之前,一定要保证数据是存在的 1、算法里面常常描述的状态是什么意思? |||-being (比如初始状态、中间状态、结束状态)
阅读全文
摘要:算法与数据结构 4.4、最大子段和-分治优化原理 一、总结 一句话总结: 在本题中,分治能够优化枚举的原理就是分治策略创造了信息(比如本题第二种情况子序列一定包含mid),让我们可以拿这个信息将枚举从O(n^2)的算法优化到了O(n) 1 //下面代码是没用好分治创造的信息的分治法代码,只能过两个点
阅读全文
摘要:算法与数据结构 4.3、最大子段和-分治解法 一、总结 一句话总结: 最大连续子序列的和有对应的分治解法,因为连续子序列只能是如下三种情况的一种:①完全处于序列的左半、②跨越序列中间、③完全处于序列的右半。取这三种情况里面的最大值,即可得到本题的解。 ①完全处于序列的左半:l<=i<=j<=mid
阅读全文
摘要:算法与数据结构 4.2、最大子段和-枚举优化 一、总结 一句话总结: 对最大子段和的枚举优化,就是通过预处理来减少重复的计算 /* 枚举优化 可以把求和的那层循环去掉,我们可以对数据做预处理 用s[i]表示第一个数到第i个数这个序列的和 那么求s[i-j](第i个数到第j个数这个序列的和)的时候,
阅读全文
摘要:算法与数据结构 4.1、最大子段和-枚举解法 一、总结 一句话总结: 枚举解法就是按照题目要求,枚举出子段,对子段进行求和,求出里面和最大的即可,思路简单,但是效率不高 枚举变量:每一段的起点、终点 枚举范围:起点:1-n,终点:起点-n 枚举判断条件: 求和得到每一段的和,在这些和里面选出最大的
阅读全文
摘要:算法与数据结构 3、砝码称重 一、总结 一句话总结: 砝码称重有基本的枚举解法,也有对应的01背包和多重背包的解法,对背包我们可以进行空间优化,对这题也可以进行bitset优化 /* C++的 bitset 在 bitset 头文件中,它是一种类似数组的结构, 它的每一个元素只能是0或1,每个元素仅
阅读全文
摘要:算法与数据结构 2、枚举 一、总结 一句话总结: 枚举法又称穷举法,它是根据题意,枚举所有可能状态,并用问题给定的条件来约束状态,检验哪些是需要的,哪些是不需要的。 1、枚举法的代码结构? 循环+判断语句,枚举几个变量就循环几次 设ai1—状态元素ai的最小值;aik—状态元素ai的最大值(1≤i≤
阅读全文

浙公网安备 33010602011771号