Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1004116
  • 博文数量: 150
  • 博客积分: 3017
  • 博客等级: 少校
  • 技术积分: 3829
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-19 14:40
个人简介

Now in Baidu WISE team

文章分类

全部博文(150)

文章存档

2014年(8)

2013年(31)

2012年(111)

分类: Python/Ruby

2012-09-18 20:10:32

n条直线最多可以把一个圆分成多少块?
 
这是个动态规划的简单题。
在圆中划两条线,显然他们相交时能分成4块。
划第3条线,显然,第3条线与其他两条都有交点(3条线不交于一点)时,划分的区域最多。
每增加一条线。至少能增加一个区域(把一个区域分成两半),然后和之前的直线,每多一个交点,就多分出一个区域。在最多情况下,若已有n条直线,增加一条直线,最多
所以有
f(n) = f(n-1) + 1 + (n-1) = f(n-1) + n;
 
一共有多少种块数不同的分法?
这一问是我自己添的,比上一问要复杂不少。
显然n=1时 g(n) =1. 只有一条线时只能将一个圆分成两半。这是唯一的分法。
当n=2时,增加的直线,当与上一条直线没有交点时,只增加了一个区域,就是 分成3份。
最多只能有1个交点,额外增加一个区域即 4份。 共有这两种分法
 
假设有n条直线时,有g(n) = m种分法。显然,所有直线无交点时,其区域个数最少,为n+1个.每增加一个交点,区域增加一个。当交点数最多的时候,区域最多。所以取值范围是(n+1 .. m);
当n+1条直线时,增加的这条直线,至少增加一个区域。最少情况是n条直线不相交,有n+1个区域,再增加的这条直线,区域至少有n+2个。所以区域最少个数是n+2,比n条直线的情况,n+1个区域是不可能的。
其余的m-1种情况,只需要新直线与之前的无交点,都是可能的。
然后,增加的直线,与之前的n条直线,可能的交点数为(0..n),所以,在n条直线交点最多的情况下,即有m个区域,每增加一个交点,增加一个区域。所以可能的范围为(m+1..m+n+1),相当于增加了n+1种分法。
所以
g(n+1) = g(n) - 1 + (n+1) = g(n) + n;
 
代码比较简单。

点击(此处)折叠或打开

  1. $lines = 10;
  2. @maxfields;
  3. $maxfields[0] = 1;

  4. @maxsol;
  5. $maxsol[0] = 1;

  6. for(1..$lines){
  7.     $maxfields[$_] = $maxfields[$_-1]+$_;
  8.     $maxsol[$_] = $maxsol[$_-1] -1 + $_ ;
  9. }

  10. print "@maxfields \n";

  11. print "@maxsol \n";

 
阅读(8427) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~