折线分割平面

Time Limit: 2000/1000ms (Java/Others)

Problem Description:

 我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目。比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示:

Input:

输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数n(0<n<=10000),表示折线的数量。

Output:

对于每个测试实例,请输出平面的最大分割数,每个实例的输出占一行。

Sample Input:

3
1
2
12

Sample Output:

2
7
277
解题思路:首先来看看直线分割平面的情况:在一个平面上有一个圆和n条直线,这些直线中每一条在圆内同其他直线相交,假设没有3条直线相交于一点,试问这些直线将圆分成多少个区域。 

分析:当添加第n条直线时,为了使圆分割成更多的区域,第n条直线要与前n-1条直线都相交,且没有任何三条直线相较于一点,则添加第n条直线会多出n-1个交点。由于每增加n个交点,就会增加n+1个区域(比如原来圆中有2条直线、1个交点、4个区域,现多加了1条红色的直线,则多加了2个交点,共有3个交点,区域个数也多加了3个,一共把圆分成7个区域),所以添加第n条直线会在原来的基础上增加n个区域。假设f(n)表示n条直线把圆内分成区域的个数,则易得递推式:f(n)=f(n-1)+n。
现在再来考虑折线分割平面的情况:平面上有n条折线,问这些折线最多能将平面分割成多少区域。

分析:由直线分割平面的结论可知,平面内原来直线与直线的交点个数决定了新增直线交点的个数,进而决定新增区域的个数。同理,当添加第n条折线时,为了使圆内分割成更多的区域,第n条折线的2条射线要与前n-1条折线相交,且没有三条射线相交于一点,则添加第n条折线会多出2*2(n-1)=4(n-1)个交点。由于每增加1个交点,就会增加2个区域,所以添加第n条折线会在原来的基础上增加4*(n-1)+1个区域。假设f(n)表示n条折线把圆内分成区域的个数,则易得递推式:f(n)=f(n-1)+4*(n-1)+1=f(n-1)+4*n-3。
AC代码:
 #include<bits/stdc++.h>
using namespace std;
int main()
{
int c,n,sum[]={,};//没有折线时只有一个平面块
for(int i=2;i<;++i)
sum[i]=sum[i-]+*i-;
while(cin>>c){
while(c--){
cin>>n;
cout<<sum[n]<<endl;
}
}
return ;
}

再来看看两道变形题:

M线分割平面(小数据)

Time Limit: 2000/1000ms (Java/Others)

Problem Description:

分割平面的题大家不会陌生了。
1条直线最多能把平面分割为2部分;
2条直线最多能把平面分割为4部分;
3条直线最多能把平面分割为7部分;
。。。等等。。。
这是用直线分割平面的,
现在我们用M来分割平面。
如图所示例子。

Input:

输入首先输入一个整数T(1 ≤ T ≤ 1000),接下来有T组数据,每组数据输入一个数N (0 ≤ N ≤ 10000),代表着M的个数。

Output:

对于每组数据,输出N个M最大能分割的平面数,格式参照样例输出。

Sample Input:

2
1
2

Sample Output:

Case #1: 2
Case #2: 19

解题思路:由上面的规律易得递推式:f(n)=f(n-1)+4*4(n-1)+1=f(n-1)+16*n-15。

AC代码:

 #include<bits/stdc++.h>
using namespace std;
int main(){
int t,n,sum[]={,};
for(int i=;i<;++i)
sum[i]=sum[i-]+*i-;
while(cin>>t){
for(int i=;i<=t;++i){
cin>>n;
cout<<"Case #"<<i<<": "<<sum[n]<<endl;
}
}
return ;
}

N线分割平面

Time Limit: 2000/1000ms (Java/Others)

Problem Description:

N型折线分割,如图,一个N型折线可以最多把平面分成2份,两个可以最多分成12份。那么n个N型折线可以最多把平面分成几份?

Input:

输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数n(0<n<=10000),表示N型折线的数量。

Output:

对于每个测试实例,请输出平面的最大分割数,每个实例的输出占一行。

Sample Input:

2
1
2

Sample Output:

2
12

解题思路:由上面的规律易得递推式:f(n)=f(n-1)+3*3(n-1)+1=f(n-1)+9*n-8。

AC代码:

 #include<bits/stdc++.h>
using namespace std;
int main(){
int c,n,sum[]={,};
for(int i=;i<;++i)
sum[i]=sum[i-]+*i-;
while(cin>>c){
while(c--){cin>>n;cout<<sum[n]<<endl;}
}
return ;
}

以上规律只适用于不是封闭曲线(特定直线构成的图形)的所有情况。

接下来看看封闭曲线分割平面的情况:设有n条封闭曲线画在平面上,而任何两条封闭曲线恰好相交于两点,且任何三条封闭曲线不相交于同一点,问这些封闭曲线把平面分割成区域的个数。

分析:先找找规律:当n=1时,封闭曲线上有0个交点,平面被分成了2个区域;当n=2时,为了使平面分成更多的区域,则第二条封闭曲线必须和前面1条曲线中每条曲线都有2个新的交点,一共就多出了2*1个新的交点,此时对应增加了2*1个区域,平面被分成了2+2=4个区域;当n=3时,同理且任何三条封闭曲线不相交于同一点,则第三条封闭曲线必须和前面2条曲线中每条曲线都有2个新的交点,一共就多出了2*2=4个新的交点,此时对应增加了4个区域,平面被分成了4+4=8个区域......由此可以推出当添加第n条封闭曲线时,其必须与前面n-1条曲线中每条曲线都有2个新的交点,一共就多出了2*(n-1) 个新的交点,此时对应增加了2*(n-1)个区域,所以添加第n条封闭曲线就会在原来的基础上多出2*(n-1)个区域。假设f(n)表示n条封闭曲线把平面分成区域的个数,则易得递推式:f(n)=f(n-1)+2*(n-1)。

实战:题解报告:hdu 1249 三角形

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1249

Problem Description

用N个三角形最多可以把平面分成几个区域?

Input

输入数据的第一行是一个正整数T(1<=T<=10000),表示测试数据的数量.然后是T组测试数据,每组测试数据只包含一个正整数N(1<=N<=10000).

Output

对于每组测试数据,请输出题目中要求的结果.

Sample Input

2
1
2

Sample Output

2
8
解题思路:结合以上的推导可知,当添加第n个三角形时,其必须与前面n-1个三角形中每个三角形都有2个新的交点,由于三角形有三条边,每条边与前面n-1个三角形都有2个新的交点,所以一共就会多出3*2(n-1)个新的交点,对应就会在原来的基础上增加6*(n-1)个区域。假设f(n)为n个三角形将平面分成区域的个数,则易得递推式:f(n)=f(n-1)+6*(n-1)。
AC代码:
 #include<bits/stdc++.h>
using namespace std;
int main(){
int c,n,sum[]={,};
for(int i=;i<;++i)
sum[i]=sum[i-]+*(i-);
while(cin>>c){
while(c--){
cin>>n;
cout<<sum[n]<<endl;
}
}
return ;
}

最后讲讲平面分割空间的情况:由二维平面分割问题可以得出规律,交点的个数决定新增区域的个数,换一下思路,我们同样能在三维中找到递推式。当n=1时,空间中有0条交线,整个空间被分成2个区域;当n=2时,为了使空间分成更多的区域,则第2个平面必须与前面1个平面中每1个平面都有1条新的交线,此时第2个平面被分成2个区域,相应增加了2个空间区域,整个空间一共被分成2+2=4个区域;当n=3时,由于任何3个平面都不会相交于同一条直线,第3个平面必须与前面2个平面中每一个平面都有一条新的交线,并且此时第3个平面有2条相交直线将其分成4个区域,相应增加了4个空间区域,整个空间一共被分成4+4=8个区域......由此可以推出当添加第n个平面时,其必需与前面n-1个平面都有一条新的交线,且第n个平面有n-1条直线分割该平面,假设sum(n)表示n个平面将空间分成区域的个数,f(n)表示n条直线将平面分成区域的个数,则易得递推式sum(n)=sum(n-1)+f(n-1),(其中f(n)=f(n-1)+n)。

实战:题解报告:hdu 1290 献给杭电五十周年校庆的礼物

Problem Description

或许你曾经牢骚满腹
或许你依然心怀忧伤
或许你近在咫尺
或许你我天各一方
对于每一个学子
母校 
永远航行在
生命的海洋
今年是我们杭电建校五十周年,这是一个值得祝福的日子。我们该送给母校一个怎样的礼物呢?对于目前的大家来说,最好的礼物当然是省赛中的好成绩,我不能参赛,就送给学校一个DOOM III球形大蛋糕吧,这可是名牌,估计要花掉我半年的银子呢。
想象着正式校庆那一天,校长亲自操刀,把这个大蛋糕分给各地赶来祝贺的校友们,大家一定很高兴,呵呵,流口水了吧...
等一等,吃蛋糕之前先考大家一个问题:如果校长大人在蛋糕上切了N刀(校长刀法极好,每一刀都是一个绝对的平面),最多可以把这个球形蛋糕切成几块呢?
做不出这个题目,没有蛋糕吃的!
为-了-母-校-,为-了-蛋-糕-(不是为了DGMM,枫之羽最会浮想联翩...),加-油-!

Input

输入数据包含多个测试实例,每个实例占一行,每行包含一个整数n(1<=n<=1000),表示切的刀数。

Output

对于每组输入数据,请输出对应的蛋糕块数,每个测试实例输出一行。

Sample Input

1
2
3

Sample Output

2
4
8
解题思路:平面分割空间问题,直接套用上面的推导公式:sum(n)=sum(n-1)+f(n-1)。
AC代码:
 #include<bits/stdc++.h>
using namespace std;
int main(){
int n,sum[]={,},f[]={,};
for(int i=;i<;++i)
sum[i]=sum[i-]+(f[i-]=f[i-]+i-);
while(cin>>n){cout<<sum[n]<<endl;}
return ;
}

ACM_平面、空间分割问题(递推dp)的更多相关文章

  1. ACM_错排(递推dp)

    RPG的错排 Time Limit: 2000/1000ms (Java/Others) Problem Description: 今年暑假GOJ集训队第一次组成女生队,其中有一队叫RPG,但做为集训 ...

  2. 递推DP URAL 1167 Bicolored Horses

    题目传送门 题意:k个马棚,n条马,黑马1, 白马0,每个马棚unhappy指数:黑马数*白马数,问最小的unhappy值是多少分析:dp[i][j] 表示第i个马棚放j只马的最小unhappy值,状 ...

  3. 递推DP URAL 1017 Staircases

    题目传送门 /* 题意:给n块砖头,问能组成多少个楼梯,楼梯至少两层,且每层至少一块砖头,层与层之间数目不能相等! 递推DP:dp[i][j] 表示总共i块砖头,最后一列的砖头数是j块的方案数 状态转 ...

  4. 递推DP URAL 1260 Nudnik Photographer

    题目传送门 /* 递推DP: dp[i] 表示放i的方案数,最后累加前n-2的数字的方案数 */ #include <cstdio> #include <algorithm> ...

  5. 递推DP URAL 1353 Milliard Vasya's Function

    题目传送门 /* 题意:1~1e9的数字里,各个位数数字相加和为s的个数 递推DP:dp[i][j] 表示i位数字,当前数字和为j的个数 状态转移方程:dp[i][j] += dp[i-1][j-k] ...

  6. 递推DP URAL 1119 Metro

    题目传送门 /* 题意:已知起点(1,1),终点(n,m):从一个点水平或垂直走到相邻的点距离+1,还有k个抄近道的对角线+sqrt (2.0): 递推DP:仿照JayYe,处理的很巧妙,学习:) 好 ...

  7. 递推DP 赛码 1005 Game

    题目传送门 /* 递推DP:官方题解 令Fi,j代表剩下i个人时,若BrotherK的位置是1,那么位置为j的人是否可能获胜 转移的时候可以枚举当前轮指定的数是什么,那么就可以计算出当前位置j的人在剩 ...

  8. 递推DP HDOJ 5328 Problem Killer

    题目传送门 /* 递推DP: 如果a, b, c是等差数列,且b, c, d是等差数列,那么a, b, c, d是等差数列,等比数列同理 判断ai-2, ai-1, ai是否是等差(比)数列,能在O( ...

  9. hdu1978(递推dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1978 分析: 递推DP. dp[][]表示可以到达改点的方法数. 刚开始:外循环扫描所有点dp[x][ ...

  10. 递推DP URAL 1031 Railway Tickets

    题目传送门 /* 简单递推DP:读题烦!在区间内的都更新一遍,dp[]初始化INF 注意:s1与s2大小不一定,坑! 详细解释:http://blog.csdn.net/kk303/article/d ...

随机推荐

  1. 学习MarkDown--初体验

    学习MarkDownPad 突然兴趣来了,在博客园里面也有Markdown的格式,昨天晚上安装了MarkDownPad pro这个是免费的,但是有些功能不支持.本来想破解的,百度了很多方法感觉不靠谱, ...

  2. Fortinet网络接入及安全方案配置步骤

    http://sec.chinabyte.com/200/12553700.shtml 1.概述: Fortinet无线接入及方案由以下两类设备组成: AC(Wifi接入控制器)及安全网关:Forti ...

  3. VC++ 2010编译错误 fatal error C1189 error This file requires _WIN32_WINNT to be #defined at least

    打开你的C++工程,找到里面的stdafx.h文件,然后把下面的红色内容替换成绿色的 参考:http://blog.csdn.net/dongliqiang2006/article/details/5 ...

  4. 【PostgreSQL】PostgreSQL操作-psql基本命令

    在阅读的过程中有不论什么问题,欢迎一起交流 邮箱:1494713801@qq.com    QQ:1494713801 一.建立数据库连接 ---------------- 接入PostgreSQL数 ...

  5. Xcode升级插件失效解决办法-升级版

    Xcode升级插件失效解决办法 每每升级Xcode,第三方插件总是中枪.解决办法也基本是依据http://joeshang.github.io/2015/04/10/fix-xcode-upgrade ...

  6. 在webkit中如何避免触发layout(重排)

    很多web开发者都已经意识到,在脚本执行中,DOM操作的用时可能比js本身执行时间要长很多,其中潜在的消耗基本上是由于触发了layout(即重排reflow:由DOM树构建为Render渲染树的过程) ...

  7. Chapter1-data access reloaded:Entity Framework(上)

    本章包括以下几个部分: 1.DataSet and classic ADO.NET approach2.Object model approach3.Object/relational mismatc ...

  8. linux losetup

    1 losetup命令的通用格式 losetup loopdev file loopdev可以看出时一个仿真设备,它本身是没有存储空间的,这个命令的作用就是将file作为它的存储空间. 一旦连接成功, ...

  9. lsblk df

    df(1) - Linux manual page http://man7.org/linux/man-pages/man1/df.1.html report file system disk spa ...

  10. 网络驱动移植之例解netdev_priv函数

    版权声明:本文为博主原创文章,未经博主允许不得转载. 开发平台:Ubuntu 11.04 编译器:gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4) 内核 ...