HDU1249 三角形 递推

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


分析:知道了直线和折线分割平面的情况这题就很简单了。我们知道,对于第i个三角形来说,其前面已经有了(i-1)个三角形==>有(3i-3)条边,对于第i个三角形,其每一条边最多能和之前的每个三角形的2条边有交点,即能和前面的(2i-2)条边各有一个交点,而这些交点会把第i个三角形的一条边分割成(2i-1)条线段,每一条线段会增加一个平面,这样3条边就增加了(2i-1)×3个平面,考虑到在三角形的三个顶点,在每一个顶点处相邻的两个线段并不会增加平面的数目,所以在三个顶点处的6个线段实质上只增加了3个平面,所以要减去这3个多算的平面数,这样,第i个三角形就会比i-1个三角形形成的平面数多出(2i-1)×3-3=6×(i-1)个了,即递推关系为:f(n)=f(n-1)+6×(i-1)。



实现代码如下:

 #include 
#include 
using namespace std;
int main()
{
    int f[10001];
    int t,n,i;
    f[1]=2;
    for(i=2;i<=10000;i++)
      f[i]=f[i-1]+6*(i-1);
    cin>>t;
    while(t--)
    {
        scanf("%d",&n);
        printf("%d\n",f[n]);
    }
    return 0;
}




本题也可以用欧拉公式来做:

欧拉公式:简单多面体的顶点数V,棱数E以及面数F之间有:V-E+F=2。


那么对于本题来说,E[i]=E[i-1]+(4i-3)*3;V[i]=V[i-1]+(2i-1)*3;

实现代码如下:

#include 
#include 
#include 

#define max 10001

int V[max],E[max];
void solve()
{
	int i;
	memset(V,0,sizeof(V));
	memset(E,0,sizeof(E));
	E[1]=V[1]=3;
	for(i=2;i


你可能感兴趣的:(计算几何,DP)