递推求解
2014-03-22 16:23
134 查看
递推求解
我一般很少写体会感悟什么的,也是因为自己实在太水了。前两天上了lcy的算法设计,上了这节课之后确实感觉受益匪浅,对递推的感悟更深了,同时也希望能给一些人看了受用.
第一类问题:
引子:在一个平面上有一个圆和n条直线,这些直线中每一条在圆内同其他直线相交,假设没有3条直线相交于一点,试问这些直线将圆分成多少区域。
这个问题很简单,相信大部分人一眼 便可看穿
F(n)=n*(n+1)/2+1;
每次和原来的每一条直线都有相交,交点加一就是新增区域数。
变形:HDU2050 http://acm.hdu.edu.cn/showproblem.php?pid=2050
题意:平面上每次增加两条折线,问折线为n时最多平面上最多可有几块区域。
这个问题恐怕一下子得不到思路了
本质:凡是此类问题,新增区域取决于新增线段数,凡是每一条新增线段,就可以带来一块新增区域,而新增线段就是此条直线与原有直线的交点有关。
在这道题里,第n条直线最多能与之前已经摆放的共2*(n-1)条直线产生相交,所以新增线段4*(n-1),但是又因为是折线,定点有一块区域连在一起再+1,所以
递推公式就很明显F(n)=F(n-1)+4(n-1)+1
写成另一种形式 就是f(n)= 2 n^2 – n + 1
那我们怎么看待这个公式的推导呢,假设原来的所有折线都从顶点延长出去变成两条直线,那么s(n)=f(2*n)-多产生的区域数,虚变实多产生的区域数==虚变实多产生线段数==2*n;
所以应用最上面的公式F(n)=n*(n+1)/2+1;
s(n)= (2 n^2 +n + 1)-(2*n); 即可得 需要一些空间想象力了
以上出自《具体数学》 好像没记错吧
思考题
设有n条封闭曲线画在平面上,而任何两条封闭曲线恰好相交于两点,且任何三条封闭曲线不相交于同一点,问这些封闭曲线把平面分割成的区域个数。
经过上面的学习,迎刃而解
第二类问题:
引子:HDU2046
http://acm.hdu.edu.cn/showproblem.php?pid=2046
题意:在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数。
我自己做的时候直接代了几组数据,发现是斐波那契数列,直接过掉,下次切不可这么囫囵吞枣了
思路:对新产生的n长度的进行分析,最右边的可能是竖着的一块,前面的n-1长度符合标准均可,为f(n-1),也有可能是横着的两块骨牌,同理就是f(n-2),所以就是f(n)=f(n-1)+f(n-2)
即斐波那契
精髓:这也是这一路题目的本质,对新产生状态进行分析,转化成原来存在的状态,进行递推求解;
变形:
有1×n的一个长方形,用1×1、1×2、1×3的骨牌铺满方格。例如当n=3时为1×3的方格(如图),此时用1×1,1×2,1×3的骨牌铺满方格,共有四种铺法。
同上题思路;
仔细分析最后一个格的铺法,发,现无非是用1×1,1×2,1×3三种铺法
公式 f(n)=f(n-1)+f(n-2)+f(n-3);
加深:
HDU1297 http://acm.hdu.edu.cn/showproblem.php?pid=1297
题意:
一排队列女生不能单独站,至少两个,求n人是站法数;
相比之前稍稍会复杂一些,但还是前面的分析套路。
分析:
如果最后一个是男的,要求n-1为合法队列,那么只要再加上一个男的都能成合法队列,所以加上f(n-1)
如果最后一个是女的,那么要求前面的还有至少一个女的,这个状态一部分可以表示成n-2个人的合法队列,那么我们只要再加上两个女的即可,就是f(n-2),当然这里还有一个容易遗漏的地方,就是如果前面的n-2个人是非法队列,我们照样可以组成n个人的合法队列,那我们怎么分析这部分状态,这部分被不合法成为合法,只能是最后两个是男+女 所以这部分就是要求n-4的合法队列即可,所以再加上f(n-4)
所以最后的递推公式就是f(n)=f(n-1)+f(n-2)+f(n-4);
当然这种觉得挺难想到
但是我想到了一种跟直观的表达式,更好理解,而起在其他类型题目上也可以广泛推广,在这里也随便记录一下。
假如用f(n)表示最后一位是女的合法数,m(n)表示最后一位是男的合法;
所以s(n)=f(n)+m(n);总的合法数就是男的合法数加上女的合法数
男女队列分开情况讨论
M(n) 等于上一位是男的合法队列再排上一个男生,也可以是最后一个是女生的合法队列再排上一个男生,仅此两种情况。
公式就是 m(n)=m(n-1)+f(n);
最后一个是女生的话,仅有最有以为是女生的合法队列的情况再加上最后一位是女生的不合法队列,很容易想吧,嘿嘿,这种情况可以等价为n-2且最后一位是男生的合法队列。
公式就推出来了 就是
f(n)=f(n-1)+m(n-2)
由此推出s(n)
最后一题
这是已近快下课了,最后匆匆讲了下
HDU 2045
http://acm.hdu.edu.cn/showproblem.php?pid=2045
题意
一串3色串,要求每两项不同色,首尾不同色;
分析:
如果有n-1的合法串,直接再加一种仅剩的颜色即可 f(n-1)
如果有n-1的不合法串,那么要求变成n的合法,仅有一种情况,就是首尾同色,这是由两种选择,这种状态也可以用n-2的合法串来表示,就是f(n-2)
所以递推公式就是f(n)=f(n-1)+2*f(n-2);
还有比较难一些的递推 错排公式 卡特兰特数
至此,递推专题就完了 就该在实战中应用它了。
我一般很少写体会感悟什么的,也是因为自己实在太水了。前两天上了lcy的算法设计,上了这节课之后确实感觉受益匪浅,对递推的感悟更深了,同时也希望能给一些人看了受用.
第一类问题:
引子:在一个平面上有一个圆和n条直线,这些直线中每一条在圆内同其他直线相交,假设没有3条直线相交于一点,试问这些直线将圆分成多少区域。
这个问题很简单,相信大部分人一眼 便可看穿
F(n)=n*(n+1)/2+1;
每次和原来的每一条直线都有相交,交点加一就是新增区域数。
变形:HDU2050 http://acm.hdu.edu.cn/showproblem.php?pid=2050
题意:平面上每次增加两条折线,问折线为n时最多平面上最多可有几块区域。
这个问题恐怕一下子得不到思路了
本质:凡是此类问题,新增区域取决于新增线段数,凡是每一条新增线段,就可以带来一块新增区域,而新增线段就是此条直线与原有直线的交点有关。
在这道题里,第n条直线最多能与之前已经摆放的共2*(n-1)条直线产生相交,所以新增线段4*(n-1),但是又因为是折线,定点有一块区域连在一起再+1,所以
递推公式就很明显F(n)=F(n-1)+4(n-1)+1
写成另一种形式 就是f(n)= 2 n^2 – n + 1
那我们怎么看待这个公式的推导呢,假设原来的所有折线都从顶点延长出去变成两条直线,那么s(n)=f(2*n)-多产生的区域数,虚变实多产生的区域数==虚变实多产生线段数==2*n;
所以应用最上面的公式F(n)=n*(n+1)/2+1;
s(n)= (2 n^2 +n + 1)-(2*n); 即可得 需要一些空间想象力了
以上出自《具体数学》 好像没记错吧
思考题
设有n条封闭曲线画在平面上,而任何两条封闭曲线恰好相交于两点,且任何三条封闭曲线不相交于同一点,问这些封闭曲线把平面分割成的区域个数。
经过上面的学习,迎刃而解
第二类问题:
引子:HDU2046
http://acm.hdu.edu.cn/showproblem.php?pid=2046
题意:在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数。
我自己做的时候直接代了几组数据,发现是斐波那契数列,直接过掉,下次切不可这么囫囵吞枣了
思路:对新产生的n长度的进行分析,最右边的可能是竖着的一块,前面的n-1长度符合标准均可,为f(n-1),也有可能是横着的两块骨牌,同理就是f(n-2),所以就是f(n)=f(n-1)+f(n-2)
即斐波那契
精髓:这也是这一路题目的本质,对新产生状态进行分析,转化成原来存在的状态,进行递推求解;
变形:
有1×n的一个长方形,用1×1、1×2、1×3的骨牌铺满方格。例如当n=3时为1×3的方格(如图),此时用1×1,1×2,1×3的骨牌铺满方格,共有四种铺法。
同上题思路;
仔细分析最后一个格的铺法,发,现无非是用1×1,1×2,1×3三种铺法
公式 f(n)=f(n-1)+f(n-2)+f(n-3);
加深:
HDU1297 http://acm.hdu.edu.cn/showproblem.php?pid=1297
题意:
一排队列女生不能单独站,至少两个,求n人是站法数;
相比之前稍稍会复杂一些,但还是前面的分析套路。
分析:
如果最后一个是男的,要求n-1为合法队列,那么只要再加上一个男的都能成合法队列,所以加上f(n-1)
如果最后一个是女的,那么要求前面的还有至少一个女的,这个状态一部分可以表示成n-2个人的合法队列,那么我们只要再加上两个女的即可,就是f(n-2),当然这里还有一个容易遗漏的地方,就是如果前面的n-2个人是非法队列,我们照样可以组成n个人的合法队列,那我们怎么分析这部分状态,这部分被不合法成为合法,只能是最后两个是男+女 所以这部分就是要求n-4的合法队列即可,所以再加上f(n-4)
所以最后的递推公式就是f(n)=f(n-1)+f(n-2)+f(n-4);
当然这种觉得挺难想到
但是我想到了一种跟直观的表达式,更好理解,而起在其他类型题目上也可以广泛推广,在这里也随便记录一下。
假如用f(n)表示最后一位是女的合法数,m(n)表示最后一位是男的合法;
所以s(n)=f(n)+m(n);总的合法数就是男的合法数加上女的合法数
男女队列分开情况讨论
M(n) 等于上一位是男的合法队列再排上一个男生,也可以是最后一个是女生的合法队列再排上一个男生,仅此两种情况。
公式就是 m(n)=m(n-1)+f(n);
最后一个是女生的话,仅有最有以为是女生的合法队列的情况再加上最后一位是女生的不合法队列,很容易想吧,嘿嘿,这种情况可以等价为n-2且最后一位是男生的合法队列。
公式就推出来了 就是
f(n)=f(n-1)+m(n-2)
由此推出s(n)
最后一题
这是已近快下课了,最后匆匆讲了下
HDU 2045
http://acm.hdu.edu.cn/showproblem.php?pid=2045
题意
一串3色串,要求每两项不同色,首尾不同色;
分析:
如果有n-1的合法串,直接再加一种仅剩的颜色即可 f(n-1)
如果有n-1的不合法串,那么要求变成n的合法,仅有一种情况,就是首尾同色,这是由两种选择,这种状态也可以用n-2的合法串来表示,就是f(n-2)
所以递推公式就是f(n)=f(n-1)+2*f(n-2);
还有比较难一些的递推 错排公式 卡特兰特数
至此,递推专题就完了 就该在实战中应用它了。
相关文章推荐
- [cocos2d-x菜鸟学习记录]解析示例helloWorld(下)
- python cgi 程序demo
- PHP 中单引号和双引号区别: Code1
- Android解析Json字符串和生成json字符串
- activity 的属性android:taskAffinity和android:allowTaskReparenting
- sqlserver调用http请求
- dba_hist_active_sess_history
- wp开发(一)--应用发布篇
- 准备将Jerasure和BOOST ASIO based 写的client和server端链接起来
- dba_hist_active_sess_history
- OMAPL138学习---CMEM
- Starting MySQL... ERROR! Manager of pid-file quit without updating file
- JAVA中的面向对象初学(持续总结更新...)
- django querty set db hit
- ZooKeeper入门-单点部署
- MVP模式与MVC模式
- MySQL Innodb表导致死锁日志情况分析与归纳
- 墨翟科技(上海)有限公司
- nginx报错zero size shared memory zone "one"
- hdu3311之状态压缩dp