杭电1466
平面上有N条直线,且无三点共点,
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //杭电1466 2 /* 3 2 4 3 5 6 7 0 1 8 0 2 3 9 */ 10 #include <stdio.h> 11 #include <stdlib.h> 12 #include <string.h> 13 int main () 14 { 15 int dp[21][191],i,j,r,n,max; 16 17 memset(dp,0,sizeof(dp)); //数组dp空间初始化为0 18 19 for(i=0;i<21;i++) 20 dp[i][0]=1; //0个交点的情况初始值为1 21 22 dp[1][0]=1; //递归出口 23 24 for(i=2;i<21;i++) 25 { 26 for(r=1;r<i;r++) 27 { 28 for(j=0;j<191;j++) //20条直线最多交点数为190 29 { 30 if(dp[i-r][j]==1) //递归思想:如果 r 条直线存在交点数 j (这里 i - r 保证了r 可以取到 1 至 i - 1,即有dp[r][k]) 31 dp[i][j+(i-r)*r]=1; //则i条直线必有(i-r)*r+j(j 即dp[r][k])个交点,标记为 1 32 } 33 } 34 } 35 36 while(scanf("%d",&n)!=EOF) 37 { 38 printf("%d",0); 39 max=n*(n-1)/2; 40 for(j=1;j<=max;j++) 41 { 42 if(dp[n][j]) 43 printf(" %d",j); 44 } 45 printf ("\n"); 46 } 47 48 return 0; 49 }
计算直线的交点数