首先是上次课的答案
Fib数列 的两道题显然都是Fib啊
组合数 求路径条数 当然可以递推,而一个绝妙的方法是 将一条路径看成是两种箭头的组合,答案直接C(m+n,n)结束,而这个方法的适用性不强
3.1 经典的结论了,设答案为f(n),则f(n)=f(n-1)+1+f(n-1) f(1)=1 通项式显然是2^n -1
3.2 也不难, 先把上面n-2个盘子移开,然后移动底层2个盘子,再移回上面的盘子。
3,3 难题,具体数学里有
3.4 设两个变量 顺时针为c逆时针为a c(n)=2*a(n-1) +1 a(n)=a(n-1)+1+c(n-1)+1+a(n-1)
4.1 设f(n,k)为最大数不超过k的答案,则答案为f(n,n) f(n,k)=f(n-k,k)+f(n,k-1) 上课时完全没有提到边界,首先n-k必须>=0 f(0,k)=1 另外k也要>0
4.2 设f(n,k)为答案 递推比较奇葩,如果有1,转移到f(n-1,k-1)如果没有1转移到f(n-k,k) f(0,k)=1
卡特兰数的前几项:1 1 2 5 14
5.1 考虑根节点,左子树有k个节点,则右子树有n-k-1个节点 构成了卡特兰数
5.2 考虑和第一个(匹配的右括号的位置,左边有k个括号则右边有n-k-1个括号 搞定
5.3 把进栈看成(出栈看成) 变成了5.2
5.4 5.2中任何时候(的个数>=)的个数所以。。
5.5 任何时候↓的个数>=→的个数 所以
//别怪我啊,马融就是这么讲的
6.1 若n为偶数,显然第1轮把偶数号的全部干掉了(设第一个人是1号) 转化为f(n/2) 而调用之后要将返回的值乘以2再减1
奇数的话,一轮下来还是干掉了所有偶数 转化为f(n/2+1) 然后乘以2加1(因为这次是从3开始数)
这个递推式可以在对数时间内完成,而马融给出了一种更牛的办法,把n写成二进制,把首个1扔到末尾就行了
6.2 把n转换成n-1,然后进行对应,1对应k+1 2对应k+2 答案是 ( f(n)+k -1) % n +1
6.3 前n轮 每个约瑟夫数都大于n即可 poj上的一道题,打表过的
6.4 计算出约瑟夫数,平移即可
答案部分结束
这次课人多了几个,马融还是迟到,不过发了份好东西给我们,他整理的USACO经典题库,分了类,NOIP非常适用。
内容是区间DP
例1 一个字符串最少删几个字符变成回文
经典水题,老师还很认真地手算了一遍作为演示
例2 T37 拿金币 也是经典题
例3 石子合并,Wiki的天梯里有,还是我不看键盘写代码的第一题
有一个变种 改成圆环怎么做
例4 T39
然后号称NOIP今年必考**和***
然后介绍了下数论,假如初赛要你计算 32^100000 mod 71怎么办
然后就结束了
插曲:
二战为什么日本的飞机一开始很强后来被美国灭了呢,因为他们的飞行员的培训方式不对。看关于飞行的电影,然后就上战场,当然会坠机啊。
以此来告诉我们自己写代码的重要性
我们编的时候老师对我说:你们学校Greatwall1995很厉害啊,顺便说我的代码写的至少很有框架(因为旁边同学写搜索没记忆化,我按照《入门经典》的方式写了标准的记忆化)