![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
王佳Gre
hi
展开
-
数字三角形
经典的dp问题朴素算法:开一个二维数组保存数字三角形map[1][1]=7map[2][1]=3 map[2][2]=8map[3][1]=8 map[3][2]=1 map[3][3]=0 for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) cin>>map[i][j];定义一个dfs(x,y)的函数,该函数能从上述三角形中位置为(x,y)处出发,往其下自动寻找最大路径和,并返回这个和。从顶端出发就是dfs(1,1)原创 2021-06-10 00:01:44 · 64 阅读 · 0 评论 -
prim算法和kruskal算法
https://www.bilibili.com/video/BV1Eb41177d1?share_source=copy_web讲的很详细哦!原创 2021-06-09 00:07:36 · 82 阅读 · 0 评论 -
spfa和bellman-ford的区别,以及和djikstra的区别
首先,三者都是用来求最短路,但是思想和复杂度不相同。bellman-ford 和spfa的区别1.Bellman-ford算法中,循环n次,每次遍历m条边,每次遍历的时候,把入度的点的距离更新成最小。然而,这样就循环遍历了很多用不到的边。比如第一次遍历,只有第一个点的临边是有效的。2.因此,spfa算法中,采用邻接表的方式,只用到有效的点(更新了临边的点),直到每个点都是最短距离为止。采用队列优化的方式存储每次更新了的点,每条边最多遍历一次。如果存在负权回路,从起点1出发,回到1距离会变小, 会一直原创 2021-06-07 23:46:40 · 624 阅读 · 0 评论 -
堆排序-笔记
堆的结构可以分为大根堆和小根堆,是一个完全二叉树,而堆排序是根据堆的这种数据结构设计的一种排序可以观察到映射后的数组按顺序排列//h[i] 表示第i个结点存储的值,i从1开始,2i是左子节点,2i + 1是右子节点//1. 插入一个数 heap[ ++ size] = x; up(size);//2. 求集合中的最小值 heap[1]//3. 删除最小值 heap[1] = heap[size]; size -- ;down(1);//4. 删除任意一个元原创 2021-05-28 23:46:03 · 92 阅读 · 0 评论 -
输入字符串把每个单词输出中间换行
这是利用了双指针算法一个思想,原先的暴力算法要n²,这里优化到n#include<iostream>#include<string.h>using namespace std;int main(){ char str[1000]; gets(str); int n=strlen(str); for(int i=0;i<n;i++){//i遍历整个字符串长度 int j=i;//j从每个单词的首字母开始 while(j<n&&str[原创 2021-04-18 20:07:05 · 479 阅读 · 0 评论 -
AcWing 797. 差分
与前缀和相关联的一题回顾一下前缀和的题目:大致意思就是找[l,r]这个区间内的和当时我们的做法是将每一个数的前i-1个和加上该数的和s[i]=s[i-1]+a[i]差分数组具体详解看这https://www.acwing.com/solution/content/26588/具体例子小细节:一开始我以为while内是l到r都要加c,debug后我发现只是l加了c,r+1减了c,后来我发现这是差分数组加减了c,改变的是b数组,实际上还原回a数组l到r都加了c...原创 2021-04-14 23:10:09 · 76 阅读 · 0 评论 -
算法课堂笔记01-语句频度计算
语句频度 T(n)称为时间频度,指的是该语句重复执行的次数例题一:矩阵相乘的关键代码1 for(int i=0;i<n;i++) n+12 for(int j=0;j<n;j++) n(n+1)3 c[i][j]=0; n*n4 for(int k=0;k<n;k++) n*n*(n+1)5 c[i][j]+=a[i][k]*b[k][i]; n*n*n分析:第一句:i执行0-n,最后一次有判断所以需要加一原创 2021-03-11 13:46:13 · 9262 阅读 · 2 评论