编程算法
旧巷小新
这个作者很懒,什么都没留下…
展开
-
算法之查找
排序系统库函数提供了sort,lower_bound,upper_bound等等方法,但是,排序往往不是简单的排序,而是需要我们自己写排序方法。1.题目:数串这道题是典型的排序编程题,但是题目并不是简单的进行字符串排序,而是需要我们进行比较后排序,否则结果会出现误解,答案错误。...原创 2020-07-18 19:59:24 · 267 阅读 · 0 评论 -
算法之深度优先搜索
深度优先搜索适用很多题目,但是,深度优先搜索的时间复杂度是O(n^2)的,因此,我们一般看到题目数据比较小的时候,我们才会考虑适用,否则,考虑其他方法。1.题目:原创 2020-07-18 20:01:27 · 281 阅读 · 0 评论 -
算法之广度优先搜素
广度优先搜素自身具有求最值得特性,一般用于求最值问题,比如说最短路径等等。1.题目:地牢逃脱该题我们可以看到是求最值问题,因此我们考虑适用广度优先搜索,用队列实现,用pair<int,int>对数据进行包装。...原创 2020-07-18 19:56:58 · 210 阅读 · 0 评论 -
算法之启发式搜索
启发式搜索从名字上来讲,我们就可以知道启发式搜索是一种有目的性的搜索,是和盲目搜索(深度优先搜索和广度优先搜索)有着重要的区别。原创 2020-10-29 18:59:26 · 605 阅读 · 0 评论 -
算法之记忆化搜索
记忆化搜索其实就是暴力搜索的过程中保存一些已经计算过的状态(思想类似于动态规划,保存计算过的状态),在暴力搜索的过程中利用这些计算过的状态从而减少很大程度上的计算,从而达到时间复杂度上的优化。1【问题描述】 小明想知道,满足以下条件的正整数序列的数量: 1. 第一项为 n; 2. 第二项不超过 n; 3. 从第三项开始,每一项小于前两项的差的绝对值。 请计算,对于给定的 n,有多少种满足条件的序列。【输入格式】 输入一行包含一个整数 n。【输出格式】 输出一个整数,表示答案。答案可能很大原创 2020-10-10 12:37:56 · 1499 阅读 · 0 评论 -
算法之动态规划分类
动态规划的分类有很多,常见的动态规划有线性规划,区间规划,约束规划,树形动态规划,数位规划等等。(一)线性规划:在该类动态规划中,方格行走类是比较基础和常见的类别,这种动态规划的难点在于得到状态转移方程。相关题目:shopee办公室解码方法...原创 2020-10-26 18:15:21 · 1361 阅读 · 0 评论 -
算法之区间规划
这类动态规划的特点是求出最值的序列,往往dp[i][j],dp[j]的j表示以j结尾求动态规划,这种题目的代表题目又最长上升子序列,最长的公共子串,子序列的问题。比如说典型的最长上升子序列问题,当数据较小的时候,我们可以使用O(N)时间复杂度的动态规划来求解。初始化:vector<int> dp(n+1,1);状态转移方程:dp[i]=max(dp[i],dp[j]+1);核心代码:for(i=1;i<=n;i++){ for(j=1;j<i;j++) if(arr原创 2020-07-18 19:56:37 · 1211 阅读 · 0 评论 -
算法之01背包问题和完全背包问题
01背包问题,多重背包问题,完全背包问题的详细描述(适合有基础的人看):初始化合法状态解释:背包问题的dp数组的初始化其实就是合法状态的情况,就是在没有任何物品可以放入背包是的合法状态。假如说题目要求背包恰好装满的话,那么此时只有容量为0时的背包可以在什么也不装的状态下“恰好装满”,此时背包价值为0,其他容量的背包都没有合法的解,属于未定义的状态,所以我们就要定义非法值,通常为负无穷大,正无穷大,或者足够大或小的值,从而保证当前的合法解,一定是从之前的合法状态推导而来的。正逆序解释:对于二维数组背包来说原创 2020-07-18 19:59:35 · 1539 阅读 · 0 评论 -
算法之树形dp
1.【题目】:某大学有N个职员,编号为1~N。他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri,但是呢,如果某个职员的上司来参加舞会了,那么这个职员就无论如何也不肯来参加舞会了。所以,请你编程计算,邀请哪些职员可以使快乐指数最大,求最大的快乐指数。【输入输出格式】输入格式:第一行一个整数N。(1<=N<=6000)接下来N行,第i+1行表示i号职员的快乐指数Ri。(-128<原创 2020-10-10 12:37:43 · 219 阅读 · 0 评论 -
算法之数位型dp
数位dp是一种计数用的dp,一般就是要统计一个区间[l,r]内满足一些条件数的个数,通常情况下l和r都比较大。所谓数位dp,字面意思就是在数位上进行dp。数位型dp的核心思想是在数位上不进行暴力搜索,而是采取记忆化搜索的形式,然后进行求值。1.只是一个数位上的数位型dp:题目:在 1 至 n 中,有多少个数的数位中包含数字 9?核心代码:#include<bits/stdc++.h>using namespace std;int dfs(vector<int>&原创 2020-10-07 17:06:20 · 378 阅读 · 0 评论 -
算法之状压dp
1.状态压缩dp的经典问题是旅行商问题,核心代码如下:#include<bits/stdc++.h>using namespace std;int main(){ int n; cin>>n; vector<vector<int>> arr(n,vector<int>(n,0)); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){原创 2020-09-13 00:20:57 · 288 阅读 · 0 评论 -
算法之矩阵快速幂优化
在斐波那契的计算中,矩阵乘法的作用是降低时间复杂度为O(logN)。普通的斐波那契f(n)=f(n-1)+f(n-2)的核心代码://这种接法的关键在于矩阵的赋值[[1,1],[1,0]]#include<bits/stdc++.h>using namespace std; vector<vector<long long>> fun(vector<vector<long long>> a,vector<vector<long原创 2020-09-15 21:10:03 · 554 阅读 · 0 评论 -
算法之数学问题
编程用到很多数学问题,因此,我们掌握数学问题变得很重要1.题目:数字游戏该题目用到迭代思想:从小到大,根据已知算法,可以得到比最小问题大一级的答案,依次类推,与递归恰恰想法,该题就是一步步用迭代思想得到答案。...原创 2020-07-18 20:01:16 · 201 阅读 · 0 评论 -
算法之快速幂取余和快速乘取余
快速乘取余(有点类似于俄式乘法)int a=23,b=55;int res=0,mod=20;while(b){ if(b&1){ res=(res+a)%mod; } a=(a+a)%mod; b=b>>1;}快速幂取余int a=23,b=55;int res=1,mod=20;while(b){ if(b&1){ res=(res*a)%mod; } a=(a*a)%mod; b=b>>1;}...原创 2020-10-13 22:46:39 · 196 阅读 · 0 评论 -
算法之拓展欧几里得与费马原理
扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足一定的等式: ax+by = gcd(a, b) =d(解一定存在,根据数论中的相关定理)拓展欧几里得算法的核心代码://返回值是a和b的最大公因数。int exgcd(int a,int b,int &x,int &y){//当b==0的时候,明显最大公因数是a,况且x=1,y=0; if (b==0){ x=1,y=0; return a; }//这个目前还没弄懂原因原创 2020-10-13 22:47:28 · 275 阅读 · 1 评论 -
算法之博弈论
博弈论的题目有如下特点:有两名选手A.两名选手交替操作,每次一步,每步都在有限的合法集合中选取一种进行B.在任何情况下,合法操作只取决于情况本身,与选手无关C.游戏失败的条件为:当某位选手需要进行操作时,当前没有任何可以执行的合法操作。经典题目:巴什博奕两个顶尖聪明的人在玩游戏,有n个石子,每人可以随便拿1−m个石子,不能拿的人为败者,问谁会胜利。思路:巴什博奕是博弈论问题中基础的问题,它是最简单的一种情形对应一种状态的博弈。我们从最简单的情景开始分析,当石子有1−m个时,毫无疑问,先手必胜原创 2020-11-01 11:43:17 · 353 阅读 · 0 评论