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*(n-1)/2);
}
return 0;
}