一、枚举:

枚举重点关注三个方面:顺序(循环的内外关系、以及枚举时的大小顺序)、范围(循环的范围,往往是作优化用)、变量的变化方式(从大到小&从小到大、※以及一次变化多少)

例1,对于这个题目,我们应该确定的事情,一个是多重循环中谁在内谁在外,再一个是循环的范围,还有就是循环变量是从大到小还是从小到大。

1.循环的内外关系:a、b、c、d依次由外到内--这样可以依次保证a最小、a相等时b最小、ab相等时c最小、abc相等时找到的d最小

2.循环的范围---往往题目中会给出各个变量之间的制约关系,这也是优化枚举策略的重点

※3.循环变量的增减方式--这一条实际上很容易忽略。比如这个题目,给了四种“值小则优先输出”的条件,但是很容易发现,只需要枚举的时候从小到大枚举,并且设计好循环的内外关系(最外层的是最需要“先”保证最小的),就可以求得这样的条件下的结果

例2,一个非常典型的通过“跳着试”来进行优化的题目--如果只是看两个,比如体力和情商,可以一次跳23天(体力的周期),这样就可以首先满足位于体力高峰,然后再看是否同为情商高峰。三个也是同理,可以一次跳过体力和情商(23和28的最小公倍数),来看是否同为智商的高峰。

例3,也蕴含着枚举题目中的一个很重要的思想----先假设再验证。

对于不同的假设进行验证即可得出结论

例4,熄灯问题。这种题目,往往会可能具有两种性质中的一种——一种是类似于“最优子结构”的性质--当前行的状态仅由上一行的灯的状态决定。仅由上一行决定也就说明了,后续子问题的状态不会再返回来影响它的状态。当然这个状态,指的是题目需要的状态,比如全灭,而不仅仅指的是特定灯的开或关;另一种就是此题这样的更加简单的子结构,第一行只要决定了,其实所有的都决定了。

①和②的分析非常关键--否则还会引出对于按钮按下的次数&按下的顺序的讨论

解题时往往会需要这种思想--把结论中的一条提出来当作条件,看这个条件成立时另外一个结论是否可以成立,其实有一点点像离散数学里的CP规则(也不怎么符合,因为CP需要的是蕴含或者析取式)。

这个题除了选用位运算外还有一个优化点--一共五行六列,如果枚举第一行的状态,就是2^6=64种,但是同样的,也可以枚举第一列的状态,就变成了2^5=32种

由此题引出的位运算的一些技巧:

1.封装--SetBit,GetBit,FlipBit

①SetBit:把某个数的右数第某位修改成指定的0/1:

void SetBit(int& val,int pos,bool num){//参数分别为:要修改的数,右数第几位(注意最右边是第0位!),修改成0/1if(num){val|=(1<<pos);return;}val&=(~(1<<pos));
}

②GetBit:Getter类函数推荐写作const,让人一看就知道是一个只读的函数

同样的,位置也是从右边开始,下标从0开始

bool GetBit(const int val, int pos)
{return val & (1 << pos);
}

③FlipBit:

翻转某一位--当第二个参数(pos)没有传入的时候,把整个数翻转。所以第二个参数的默认值应该是个特殊值,比如-1

????

另外:像这些短小但可能经常使用的函数,为了保证效率,可以均设置为inline函数

其他的一些位运算的典型题,在博客的其他文章里有整理。

二、递归

北大郭炜算法课笔记整合相关推荐

  1. 程序设计与算法三~C++面向对象程序设计~北大郭炜MOOC学习笔记~第二章:类和对象初步(新标准C++程序设计)

    以下内容为笔者手打,望读者珍惜,如有转载还请注明. chapter2:类和对象初步 数据结构+算法=程序 $2.1结构化程序设计的不足     结构化程序设计也称面向过程的程序设计,过程是用函数实现的 ...

  2. 程序设计与算法三~C++面向对象程序设计~北大郭炜MOOC学习笔记~第三章:类和对象进阶(新标准C++程序设计)

    以下内容为笔者手打,望读者珍惜,如有转载还请注明. chapter 3:类和对象进阶 $3.1构造函数 $3.1.1 构造函数的概念和作用     全局变量在程序装入内存时就已经分配好了存储空间,程序 ...

  3. 程序设计与算法三~C++面向对象程序设计~北大郭炜MOOC学习笔记chapter1第一章(新标准C++程序设计)

    以下内容为笔者手打,望读者珍惜,如有转载还请注明. $1.4强制类型转化运算符的新形式:     类型名(待转化的表达式),如double(a),int(3.5) $1.5函数参数的默认值     在 ...

  4. 程序设计与算法三~C++面向对象程序设计~北大郭炜MOOC学习笔记~第五章:继承与派生(新标准C++程序设计)

    以下内容为笔者手打,望读者珍惜,如有转载还请注明. 第五章 继承与派生 $5.1 继承与派生的概念 $5.1.1 基本概念     在C++中,当定义一个新的类B时,如果发现类B拥有某个已经写好的类A ...

  5. 北大郭炜慕课程序设计与算法(一)C++的OpenJudge题目答案

    北大郭炜慕课程序设计与算法(一)C++的OpenJudge题目答案 学习心得 题目答案 001 输出第二个整数 002 字符菱形 003 打印ASCII码 004 打印字符 005 整型数据类型存储空 ...

  6. LeetCode左程云算法课笔记

    左程云算法课笔记 剑指Offer 位运算 ^运算符理解 寻找出现双中的单数 取出一个数最右边1的位置 找所有双出现中的两个单数 整数二进制奇数位偶数位交换 数组中全部出现k次返回出现一次的数 链表 判 ...

  7. 北大郭炜教授《程序与算法(二)算法基础》学习笔记

    目录 第一章 枚举 例题一 完美立方 例题二 生理周期 例题三 称硬币 例题四 熄灯问题 第二章 递归(一) 例题一 求阶乘 例题二 汉诺塔 例题三 n皇后问题 例题四 逆波兰表达式 补充笔记(fro ...

  8. 北大郭炜《程序设计与算法(三)》Mooc笔记:运算符重载和继承

    文章目录 运算符重载 运算符重载的基本概念 赋值运算符的重载 为什么引入赋值运算符重载? 浅拷贝和深拷贝 对operator=返回值的讨论 复制构造函数的相同困境 运算符重载为友元函数 实例:可变长数 ...

  9. 左程云老师算法课笔记( 四)

    前言 仅记录学习笔记,如有错误欢迎指正. 啊啊,才发现二被我挤掉了,有空补下! 一.图: 图的深度优先遍历:(和二叉树的区别就是有环,不能重复打印)(Queue队列) 图的广度优先遍历:(和二叉树的区 ...

最新文章

  1. VS2010 断点无效肿么办?
  2. 《移动应用开发》作业——HTML、CSS
  3. 计算机在财务核算中的应用,浅谈计算机在财务核算和财务管理工作中的辅助应用...
  4. Bootstrap使用-1
  5. MVVM模式于MVP模式
  6. 内部类(innerclasses)
  7. Http压力测试之ab
  8. Error--解决使用Application Loader提交ipa包审核时的报错:ERROR ITMS-90168: The binary you uploaded was invalid....
  9. 下载并在Eclipse中关联Android源代码
  10. Android自定义标题栏
  11. mysql double 和Oracle,oraclemysql对比
  12. IDEA中XML与main文件里设置自动补全快捷键
  13. ASP.NET的gridview设置数据格式(DataFormatString={})与 String.Format()【转载】
  14. 魅族android密码,魅族手机Flyme账户密码或密保忘记解决办法
  15. MATLAB机器学习决策树网格法优化参数学习笔记
  16. 一个程序员失败的爱情
  17. 区块链与大数据,打造智能经济(读书笔记)——井底望天
  18. 区块链教程之Bitcoin公钥和地址生成
  19. python — numpy计算矩阵特征值,特征向量
  20. 关于评审--从思想到落地

热门文章

  1. ET篇:ETBook笔记(1.2 为什么使用C# .net core做服务端?)
  2. 《你不可不知的人性》刘墉 读书笔记(二)
  3. 我国计算机技术的发展概括,计算机科学与技术的发展趋势浅析
  4. 我用DoS把自己网站弄挂了
  5. php模拟登陆,php实现模拟登陆正方教务系统
  6. java 显示另一个窗口_java界面从一个界面跳到另一个界面的时候多出了一个小窗口...
  7. 用Java编写的双色球摇奖系统
  8. 卓有成效的管理:你逃不过的功课你要完成它
  9. 神经官能症虽属常见病,烦起来真要命
  10. android系统流畅度排行,最流畅安卓手机排名:华为mate40Pro第六,第一堪比iOS!...