《算法竞赛入门经典》第七章7.1,7.2,7.3(总结)

来源:互联网 发布:金融数据库有什么后果 编辑:程序博客网 时间:2024/04/27 17:44

7.1
一般如果让你求a,b满足h(a,b)=k,k为一个固定的函数,可以通过枚举a,然后用k反向求b,来减少一层循环,两个以上情况同理。
1.技巧总结如果求abcdefgh判断他们是否互补相等,可以从0~n分别对应,然后通过从0~n一 一对i==a[i]来判断是否每一个都存在,来得出结果。
2.尽量把除法表示的关系转换成乘法,避免int截位

7.2

生成有重复和无重复的排列都可以用c++库中的next_permutation

sort(p,p+n)do{}while(next_permutation(p,p+n)

他的原理是每次将p按字典序增加,所以用do while,对1234…n这个处理。可以得到全部排列,如果一次变化后发现与上次序列一样则继续变化。

手写的算法,不可重复类型原理是:
如果if(cur==n)则输出,else(一定不要丢){递归}

有重复,则用c1,c2来判断能否继续增长

输出时为了避免重复输出
if(!i||p[i]!=p[i-1])
来只输出第一个

7.3
1.增量构造法就是每次将比前一个大一的放进去,这样最终输出顺序就是按照字典序排列的了

技巧:定序,将{1,2},{2,1},按从小到大排列,这样就只用输出一个{1,2}了;

2.位向量法,节点比增量构造法多的原因是因为,他需要将所有的B对应的A都判断完才输出,这样就有很多无效的状态,但很明显大部分节点都在最后一两层。

3.二进制法很简单,但是要注意1<

1 0
原创粉丝点击