hd acm1466

http://www.cnblogs.com/alihenaixiao/p/4107907.html#undefined。这个博客有详解,我这个只是写一些·自己的总结。

问题:平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数。
      比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行)。

析:   多条直线在一起时,要么相交,要么平行,所以我们可以把n条直线分为平行的一组,不平行的一组,那么答案就出来了;

    平行的那组(假设有i条平行)交点数为0,那么相交的那组 (还有n-i条)交点为f(n-i),;两组之间的交点有i*(n-i)个交点,三者相加便是n条直线存在交点的情况,而随着i与n-i的          变化,n条直线的交点数目情况便都出来了。

代码:

#include<stdio.h>
int dp[21][191];            //d[直线的总数][交点的个数]。

int main()
{
  int i,j,k,n;
  for(i=0;i<21;i++)
  {
    dp[i][0]=1;
  }
  for(i=1;i<21;i++) //i代表线段总数,j代表平行的线段总数,那么(i-j)代表相交的直线总数。
    for(j=0;j<i;j++)
    {
      for(k=0;k<=i*(i-1)/2;k++) //i条直线最多有(i-1)/2个交点。
      {
        if(dp[i-j][k]) //这个是检查当有(i-j)条直线时存不存在这些直线有k个交点的情况。
        dp[i][(i-j)*j+k]=1;
      }
    }
  }
  while(~scanf("%d",&n))
  {
    for(i=0;i<n*(n-1)/2;i++)
    {
      if(dp[n][i])printf("%d ",i);
    }
    printf("%d ",n*(n-1)/2);
  }
  return 0;
}

原文地址:https://www.cnblogs.com/clljs/p/7467505.html