【ACM_递推】HDU 1466 计算直线的交点数

HDU 1466 计算直线的交点数   http://acm.hdu.edu.cn/showproblem.php?pid=1466


由题意不难得出   n=1 时  输出 0

                   n=2 时  输出 0 1

                   n=3 时  输出 0 2 3

现在我们分析当N=4时的交点数

① 当第N条直线平行于前3条直线时      此时交点数为0

② 当第N条直线平行于前2条直线时      此时三条平行直线与另外一条直线必有3*1个交点

          而此时另外1条直线有0个交点                            因此交点数为 1*3 + 0 = 3

③ 当第N条直线平行于前1条直线时      此时两条平行直线与另外两条直线必有2*2个交点

          而此时另外2条直线有0个或1 个交点                因此交点数为  2*2 + 0 = 4 或 2*2 + 1 = 5

④ 当N条直线都不平行时                        此时第N条直线与另外三条直线必有1*3个交点

         而此时另外3条直线有0个、2个或3个交点       因此交点数为  1*3 + 0 = 3 、1*3 + 2 = 5、1*3 + 3 = 6

所以 当N=4时,可能有0、3、4、5、6个交点

根据上面的分析,我们可以得到规律

第N条直线可以与 0~(N-1)条直线平行  且有且必有  平行线数*(N-平行线数)个交点

另外(N-平行线数)条直线又可根据(N-平行线数)条直线的交点数得到

互相组合,即可得到N条直线的交点个数

----------------------------------------------------------------------------------------------------------------------------------------

由已知直线数,得出最大交点数为 n*(n-1)/2

题中N<=20    因此最大交点数为190

将N条直线的交点数进行打表    存入f[直线数][交点数]中

#include<stdio.h>
#include<string.h>
int main(void)
{
	int n,f[21][192],i,j,k;
	memset(f[0],0,sizeof(f[0]));
	memset(f[1],0,sizeof(f[1]));
	f[1][0] = 1;
	for (i=2;i<=20;i++){
		memset(f[i],0,sizeof(f[i]));
		f[i][0] = 1;  //存在N条直线全部平行
		for (j=1;j<i;j++){  //j为与第N条直线不平行的直线数
			for (k=0;k<192;k++){
				if (f[j][k]==1) f[i][(i-j)*j+k] = 1;  //k为不与第N条直线平行的直线的交点数
			}
		}
 	}
	while(scanf("%d",&n)!=EOF){
 		printf("0");
		for (i=1;i<192;i++)
 			if (f[n][i]==1) printf(" %d",i);
		printf("\n");
 	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值