自从学习《算法导论》以来已经有一段时间了,这段时间真可谓心酸,感觉web比算法简单多了,都是一些重复性的配置,但是看算法也是为了秋招的时候能去个好公司啊,所以一定要坚持下去。目前为止,基本的算法思想数据结构等都看完了,剩下的那些,真的不大容易看,总结来说《算法导论》真是经典,每一个理论都讲得很细,让人理解的很透彻,但是本科生读这本书也是很难的,所以最好能在上研究生的时候研究完,鄙人因为不大喜欢考研,所以就不闲扯了……以后会相继更新这些博客中的题,然后动规 、贪心 等算法。
1.浅谈分治策略
分治,在《算法导论》上学习的就是,分开求解,然后再求解子问题,最后把子问题的解合并起来,思想大部分人都会懂的。但是实践应用起来 ,也不是简单,关键怎么想出一个当前问题表示成子问题的思路,还有当子问题规模足够小的时候,怎么结束递归,考虑所有包含的情况,因此这并不是简单的事情。
2.问题集锦
例一:整数划分问题
将一个正整数n表示成一系列正整数之和,n=n[1]+n[2]+...+n[k],其中n[1]>=n[2]>=...>=n[k]>=1,k>=1。正整数n的一个这种表示称为n的一个划分。求n的不同划分个数。
用递归算法求解:
(1)递归子结构性质:显然n的一个划分中包含了某个子问题t(<n)的一个划分。这里问题的解是划分数,关键是要研究用子问题的划分数来定义原问题的划分数。在n的所有不同划分中,将其中最大加数n[1]不大于m的划分数个记作q(n,m),则q(n,n)为原问题的解。递归定义如下:
1)当n<1或m<1时,显然q(n,m)=0;
2)当m=1时,n只有一种划分形式,n=1+1+...+1,共n个1相加。q(n,1)=1;
3)当n=1时,显然也只有一种划分形式,q(1,m)=1;
4)当n<m时,因为n[1]不能大于n,故q(n,m)=q(n,n);
5)当n=m时,q(n,n)为n的所有划分个数,它由n[1]<=n-1的划分和n[1]=n的划分(只有一个)组成,q(n,n)=q(n,n-1)+1;
6)!当n>m>1时,n[1]不大于m的划分,由n[1]<=m-1的划分和n[1]=m的划分组成,q(n,m)=q(n,m-1)+q(n-m,m)。关键!(分析:当只求最大加数为m的时候 第二个最大加数为n-m(因为 n-m+m=n)
对n划分: n=m+(n-m)
1. 因为 当 m>(n-m)时就是求n-m的所有划分 即(n-m,n-m),因为m>n-m 所以可以写成(n-m,m)
2. 当m<(n-m)时,后面若为n-m的全划分,就超过m为最大划分了,矛盾。所以求 n-m的最大加数为m的划分