算法
江河(Krisen)
关关难过关关过,长路漫漫且灿灿,山山漫漫结成关,人人草草尽走散
展开
-
算法的一些技巧,(针对于有一定基础的)
1.深度搜索方向数组vector<int> dir = {-1,0,1,0,-1};一个点从四周去dfs切记 dfs首先要判断边界条件下标位置 不在范围内 或者 已经遍历过 再或者 该位置不是我们想要的数据一律跳过 不准继续搜已经遍历过 有两种可能 一种需要回溯 另外一种则不需要vector<vector<bool>> check(n,vector<bool>(n,false));check[i][j] = true;然后去这个点上下原创 2021-11-25 20:19:38 · 163 阅读 · 0 评论 -
数据结构之算法篇leetcode
刷题我们常会用一些数据结构和对其操作的api,我来总结一番listlistlst1; //创建空listLst1.front() 返回第一个元素Lst1.back() 返回最后一个元素Lst1.pop_front() 删除第一个元素Lst1.pop_back() 删除最后一个元素Lst1.push_back() 在list的末尾添加一个元素Lst1.push_front() 在list的头部添加一个元素map unordered_map初始化map<int,ch原创 2021-10-30 13:00:42 · 83 阅读 · 0 评论 -
上界估算
#include <cstdio>#include<iostream>#include<cmath>using namespace std;int num[10];void init(){ int t; for(int i=1;i<=9;i++){ t=i; for(int j=1;j<5;j++){ t*=i; } num[i]=t;.原创 2020-12-21 17:28:28 · 291 阅读 · 0 评论 -
十字相乘
#include <cstdio>#include<iostream>#include<cmath>using namespace std;int check(int i,int j){ int x1=i/10,x2=i%10; int y1=j/10,y2=j%10; if(!x1||!x2||!y1||!y2) return 0; //10/90这种筛选掉 if(x1==y2 && x2*j==y1*..原创 2020-12-21 15:16:29 · 160 阅读 · 0 评论 -
数字位数计算
#include <cstdio>#include<iostream>#include<cmath>using namespace std;int dight(int x){ return (int)floor(log10(x))+1; //向下取整数 求位数}int check(int x,int*num){ //检查个个位数是否相同 while (x) { if(num[x%1.原创 2020-12-21 14:25:40 · 1480 阅读 · 0 评论 -
数塔狂想曲
#include <cstdio>#include<iostream>using namespace std;int n,m,num[1005][1005],utd[1005][1005],dtu[1005][1005],ans[1005][1005],mmax[1005][2];int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ for(int j=1;j原创 2020-12-19 18:53:24 · 143 阅读 · 1 评论 -
数字三角形 数塔问题
求路径最大的值,先将正三角形 先转换成直角三角形 好进行坐标排序将第一个数设(1,1) 那么就是周围是0;dp[i][j]=max(dp[i-1][j-1],dp[i-1][j]+num[i][j];从上往下#include <iostream>using namespace std;int n,num[20][20],ans[20][20];int main() { int n; cin>>n; for(int i=1;i<=n;i.原创 2020-12-19 10:39:33 · 1022 阅读 · 2 评论 -
路径数问题
除了第一行 的元素 和第二行的元素 其他元素都是左边一个 加上上一个 ,为了使的循环好整 我们定起始点为(1,1) 方形以外为0#include <iostream>using namespace std;int main() { long long dp[25][25] ={0}; for(int i=1;i<=21;i++){ for(int j=1;j<=21;j++){ if(i==1&&j=.原创 2020-12-18 20:46:22 · 244 阅读 · 1 评论 -
一千位斐波那契数
在斐波那契数钟,第一个有1000位的数字是第几项也就是说第一个数组代表 2 第二个代表1 2 3 ,交换 ,3 2,在进行加 3 5,在交换#include<iostream>#include<cstring>#include<cmath>using namespace std;int func(int *n1,int *n2){ n2[0]=n1[0]; for(int i=1;i<=n2[0];i++){ n2[i原创 2020-12-18 11:49:37 · 608 阅读 · 0 评论 -
移动窗口法
在如下的1000位数字中,连续十三个的最大成绩 包含0的数组 13个含0就是0#include<iostream>using namespace std;char num[1005];long long ans,now =1;int zero_cnt;int main(){ cin>>num; for(int i=0;i<1000;i++){ if(i<13){ if(num[i]=='0'){原创 2020-12-16 11:32:13 · 2002 阅读 · 0 评论 -
记忆数组
记忆数组斐波那契数 优化#include<iostream>using namespace std;long long num[50];long long f(int n){ if(n==0||n==1) return 1; if(num[n]) return num[n]; return num[n]= f(n-1) + f(n-2);}int main(){ for(int i=1;i<=40;i++){ cout<原创 2020-12-18 09:45:17 · 309 阅读 · 0 评论 -
大整数加法乘法
两个大整数加法 普通整形或者长整型储存不下的时候 需要用到字符 和数组由于加法会进位 所以我们需要将数字反向放入数组 将第0位 存入字符长度#include<iostream>#include<cstring>using namespace std;int num1[105],num2[105],sum[105];char s1[105],s2[105];int main(){ cin>>s1>>s2; num1[0] =st原创 2020-12-18 09:44:13 · 267 阅读 · 0 评论 -
方向数组法
注意: 上下左右八个方向,为避免重复,只需操作其中四个即可 四个方向对应的方向数组#include<iostream>using namespace std;int drcx[4]={0,1,1,1};int drcy[4]={1,1,0,-1};int num[35][35],ans;int main(){ for(int i=5;i<25;i++){ for(int j=5;j<25;j++){ cin&.原创 2020-12-16 15:45:09 · 527 阅读 · 2 评论