dp可能出现的两种形式:
1、跟数组一样dp[i][j]
2、类似dfs的递归函数dp(1, m),函数里面往往需要一个用于存储值的变量数组,这个数组要定义在main函数外面
注:dp递归时,可以用备忘录方法,加快速度,if(ans[l][r] != -1 return ans[l][r])
快排向上取整,归并向下取整。
表达式计算:
栈顶的优先级高,先弹出两个数字和栈顶操作符,计算结果入栈,新操作符再入栈
栈顶的优先级低,新操作符直接入栈
其实就分两种情况:
1、无括号,就按照上面的优先级比较来计算
2、有括号,计算,知道碰到左括号。
KMP就是分三种情况:
s[i] == p[j+1], j指针往后 j;
j > 0 && s[i] != p[j + 1] j指针往后移,找到能重合的字段的最后一个位置
j == 0,就是开头的首个字母都对不上,直接指针 i 往后移,i 在for循环中会加。
模拟堆中的问题:
1、要记录第idx插入的所对应在数组的索引是k —数组ph[]
2、要记录索引 k 下对应元素是第idx插入的-------数组hp[]
dfs算法中:
往往dfs(x) 中的x表示的是将来的要处理的x,而不是当前已经处理了的。这样写往往会很方便,思路很清晰。然后
递归跳出dfs的条件,就是dfs函数的开头第一句,往往是 x == n + 1。
dfs()函数一般就两部分,第一部分:if(x == n + 1) return ; 第二部分:for(int i = a : b) dfs(x + 1)..... 就这两部分就好了其实。
dfs 一般用于求几条路径,因为往往需要到一个终点n
bfs 一般用于求某条路径的最小距离。
一维数组转二维公示: idx / n 为行 idx % n 为列
关于邻接表:
h[a], h[b]中a,b就是代表具体的 节点的标号,如1、、2、、3、4等等。
而h[a], h[b]所代表的值就是就是索引 idx 的值,可能是100,10000,100000等等。
dijikstra 和 prim
函数里就三步:1、for(i = 0:n-1) 2、for(j = 1:n,找 t = j) 3、利用 t 更新;
spfa()
1、创立一个queue,push第一个 2、While que.sieze() 3、对头出列、for( i = h[t] : -1) 4、for里面,if dist[t] + w[i] < dist[j] , 更新距离,!st[j],push
数组问题:
双指针,关键在于怎么移动指针,左右两个指针先移动哪个。