链接:http://acm.hdu.edu.cn/showproblem.php?pid=1466
题意:n条直线,输出其所有交点的情况
这个题,我做练习的时候没推出来,然后网上看了一些解题报告,感觉也没说清楚,都是在说一个公式,(i-j)*j+k,我分析得也不清楚,类似找规律推出来的,只解释下公式就行了:i条直线,可以分成两部分,j条互相平行的直线,(i-j)条不互相平行的直线,k是j条直线所有有可能的交点数。
代码:
#include<stdio.h>
#include<string.h>
int dp[22][200];
int main()
{
int i,j,k;
dp[0][0]=dp[1][0]=dp[2][0]=dp[2][1]=1;
//n条直线最多的交点数为(n-1)*n/2
for(i=1;i<=20;i++)//i条直线
for(j=0;j<=i-1;j++)//j条互相平行的
for(k=0;k<=(j-1)*j/2;k++)//遍历j条直线所有可能的交点数
if(dp[j][k])
dp[i][(i-j)*j+k]=1;
int n;
while(scanf("%d",&n)!=EOF)
{
printf("0");
for(i=1;i<=(n-1)*n/2;i++)
if(dp[n][i])
printf(" %d",i);
printf("\n");
}
return 0;
}