算法中小技巧

思路

1、递归可以从头到尾访问,也可以从尾到头访问
2、前序的第一个访问节点是根节点,然后是左子树和右子树;中序先访问的是左子树,然后根节点和右子树
3、一定要考虑特殊情况,null, 空值,长度为0啊
4、分治算法将算法拆分,这也就意味着需要有合并的策略。
5、递归,迭代一般能够将问题转换成同样的问题,但会减小问题难度。
6、动态算法将子问题的最优解存储下来,以供父问题使用,也就存在一个从子问题到父问题的转换逻辑。
7、贪心:局部最优能够保证后续的最优。

递归-存储

如果递归计算过程中需要重复计算某个参数的值,则应该将其存储起来。

int fib(int n){
	if(n<=1) return n;
	return fib(n-1)+fib(n-1);
}
int memo[MAXN+1];
int fib(int n){
	if(n<=1) return n;
	if(memo[n]!=0) return memo[n];  //查询
	return memo[n] = fib(n-1)+fib(n-1); //存储
}

深度,广度搜索-剪枝

穷竭搜索可能会将所有的可能解都检查一遍,但有时早已明确知道从当前状态无论如何转移也不会存在解,这种情况下应该跳过继续往下搜索。

memset赋值初始化

memset是按字节为单位进行填充,一般可以直接赋值0、-1(每一位二进制都为1)。对于无穷大,一般采用0x3f3f3f3f

加速c++的cin和cout

std::ios::sync_with_stdio(false); //cin,cout效率低是因为要把输入、输出的东西存入缓冲区,再输入、输出,导致效率降低。该语句可以来取消iostream的输入、输出缓存,使效率与scanf与printf相差无几。C++为了兼容C,保证程序在使用了std::printf和std::cout的时候不发生混乱,将输出流绑到了一起。
cin.tie(NULL); //默认的情况下cin绑定的是cout,每次执行 << 操作符的时候都要调用flush,会增加IO负担。可以通过tie(0)(0表示NULL)来解除cin与cout的绑定,进一步加快执行效率。

#include <iostream>
int main() 
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    // IO
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值